Я использую типы из @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
, без передачи определения переменной типа каждый раз .