Я использую перекомпоновку в React, в частности ее функцию compose
, которая имеет сигнатуру
function compose<TInner, TOutter>(
...functions: Function[]
): ComponentEnhancer<TInner, TOutter>;
interface ComponentEnhancer<TInner, TOutter> {
(component: Component<TInner>): ComponentClass<TOutter>;
}
, где я передаю некоторые компоненты React более высокого порядка.Я определил свои типы TInner
и TOuter
как интерфейсы, которые описывают то, что мне нужно для работы моих HoC:
interface IOuterProps {
somethingYouGiveMe: string;
}
interface IInnerProps {
somethingIGiveBack: number;
}
const myEnhancer = compose<IInnerProps, IOuterProps>(myHoC, myOtherHoc);
(как глупый пример для демонстрации).Но проблема в том, что мои компоненты имеют больше реквизита, чем тот, который генерирует HoC, должен взять эти дополнительные реквизиты и передать их, например:
interface IMyComponentProps {
somethingYouGiveMe: string;
somethingElse: string;
}
Из-за этого я не могу сделатьconst MyEnhancedComponent = myEnhancer(MyComponent)
, так как компилятор будет жаловаться, что MyEnhancedComponent
не имеет somethingElse
в качестве реквизита.
Я нашел два обходных пути, и я не доволен.Любопытно, что сделали бы более опытные разработчики TypeScript.
Обходной путь # 1: Введение функции
Представляя функцию, я могу использовать обобщенные значения и выражать компилятору то, что я делаю
function myEnhancer<TInnerProps extends IInnerProps, TOuterProps extends IOuterProps>(Component: React.ComponentType<TInnerProps>) {
return compose<TInnerProps, TOuterProps>(mYHoC, myOtherHoc)(Component);
}
Мне очень не нравится это, вводить функцию, которая создаст несколько копий энхансера, просто чтобы получить дженерики?Мне кажется это неправильным.
Работа вокруг # 2: используйте [ключ: строка]: любой
Вместо этого я могу изменить свои интерфейсы на
interface IOutterProps {
somethingYouGiveMe: string;
[key: string]: any;
}
interface IInnerProps extends IOuterProps {
somethingIGiveBack: number;
}
Я в принципеиспользуя [key:string]: any
как бедного человека extends IOutterProps
.Как, например, мне нужно, чтобы вы дали мне эти реквизиты, и если вы дадите мне дополнительные услуги, то я на самом деле не забочусь о них.
Это позволяет мне использовать myEnhancer
везде, где у меня есть компоненты, которые соответствуюттребований, избегает добавленной функции и чувствует себя лучше, чем обходной путь № 1.Но также неправильно добавлять [key: string]: any
.