Объединение объявлений Typescript для расширения или переопределения типа модуля или свойства интерфейса - PullRequest
0 голосов
/ 28 февраля 2019

Я использую типы из @types/react-router-dom версии 4.3.1, которая импортирует типы из @types/react-router и @types/history.

В моем приложении у меня всегда есть два свойства в состоянии местоположения, и я хочуони автоматически извлекаются из интерфейса RouteComponentProps без необходимости каждый раз передавать интерфейсную переменную типа LocationState.

Определение интерфейса RouteComponentPropsв react-router и это выглядит следующим образом:

import * as H from 'history';

export interface RouteComponentProps<Params extends { [K in keyof Params]?: string } = {}, C extends StaticContext = StaticContext, S = H.LocationState> {
  history: H.History;
  location: H.Location<S>;
  match: match<Params>;
  staticContext?: C;
}

Определения ссылочных интерфейсов / типов из history:

export interface Location<S = LocationState> {
    pathname: Pathname;
    search: Search;
    state: S;
    hash: Hash;
    key?: LocationKey;
}

export type LocationState = History.LocationState;

export namespace History {
    export type LocationState = any;
}

Что яХотите расширить определение типа свойства состояния интерфейса Location, чтобы включить пользовательский интерфейс (т.е. включить свойства, которые всегда доступны).Итак, что-то вроде state: S & { A: string; B: string; }.

Я попытался переназначить интерфейс RouteComponentProps в объявлении модуля для react-router, но все, что я пробую, приводит к All declarations of 'RouteComponentProps' must have identical type parameters.ts(2428) или Subsequent property declarations must have the same type. Property 'location' must be of type 'Location<S>', but here has type 'any'.ts(2717).

Я также попытался переназначить интерфейс Location в объявлении модуля истории с тем же результатом.После чего я попытался переопределить тип LocationState внутри и снаружи пространства имен History, но это всегда приводит к Duplicate identifier 'LocationState'.ts(2300).

Могу ли я что-нибудь сделать, чтобы получитьжелаемое поведение кроме написания пользовательского интерфейса для RouteComponentProps с другим именем ?Я хочу иметь возможность импортировать этот интерфейс в проект, расширять его с помощью реквизитов компонента и иметь свойства 'A и B типов, доступные из props.location.state, но также иметь возможность обрабатывать любые другие свойства как any, без передачи определения переменной типа каждый раз .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...