Перекомпоновать с помощью StateHandlers и TypeScript, тип реализации утечки в компонент?
Я пытаюсь обернуть функциональный компонент без сохранения состояния withStateHandlers
от перекомпоновки. Я нахожу единственный способ сделать это, если я настрою реквизиты своего SFC, чтобы соответствовать некоторым аспектам withStateHandlers
это "утечка". Я делаю что-то не так или это недостаток в типах перекомпоновки?
Мой SFC:
interface IProps {
className?: string;
isEditing: boolean;
toggleEditing: () => void;
}
const MyComponent: React.SFC<IProps> = ({ className, isEditing, toggleEditing }) => (
<button className={className} onClick={toggleEditing}>{isEditing ? 'stop editing' : 'start editing'}</button>
);
export default MyComponent;
Отсюда я хочу обернуть его withStateHandlers
:
import { withStateHandlers, StateHandlerMap, StateHandler } from 'recompose';
import MyComponent from '../components/myComponent';
interface IProps {
className?: string;
}
interface IToggleEditingState {
isEditing: boolean;
}
interface IToggleEditingStateUpdaters extends StateHandlerMap<IToggleEditingState> {
toggleEditing: StateHandler<IToggleEditingState>
}
const withToggleEditState = withStateHandlers<IToggleEditingState, IToggleEditingStateUpdaters, IProps> (
{ isEditing: false },
{
toggleEditing: (state) => () => ({ isEditing: !state.isEditing })
}
);
const StatefulMyComponent = withToggleEditState(MyComponent);
Но это не работает, я получаю эту ошибку во время компиляции:
(32,43): Argument of type 'StatelessComponent<IProps>' is not assignable to parameter of type 'ComponentType<IProps & IToggleEditingState & IToggleEditingStateUpdaters>'.
Type 'StatelessComponent<IProps>' is not assignable to type 'StatelessComponent<IProps & IToggleEditingState & IToggleEditingStateUpdaters>'.
Type 'IProps' is not assignable to type 'IProps & IToggleEditingState & IToggleEditingStateUpdaters'.
Type 'IProps' is not assignable to type 'IToggleEditingStateUpdaters'.
Types of property 'toggleEditing' are incompatible.
Type '() => void' is not assignable to type 'StateHandler<IToggleEditingState>'.
Type 'void' is not assignable to type 'Partial<IToggleEditingState> | undefined'.
Это связано с toggleEditing
определяется как () => void
в реквизитах MyComponent. Я исправляю это, а также получаю ошибку об отсутствующем индексаторе.
Чтобы доволен компилятором, мне нужно поменять MyComponent
IProps быть:
interface IProps {
className?: string;
isEditing: boolean;
toggleEditing: (...payload: any[]) => any;
[key: string]: any;
}
Я должен измениться toggleEditing
соответствовать типу StateHandler<T>
как определено в @types/ Recompose. Мне также нужно добавить индексатор. Это выглядит потому, что в @types/ Recompose, withStateHandlers
возвращает InferableComponentEnhancerWithProps<TOutter & TState &TUpdates, TOutter>
, который в конечном итоге после того, как вы пройдете все типы, все еще ожидает индексатор для компонента.
Я заметил, что в тестах они определяют SFC, а затем упаковывают все это в одном месте. Таким образом, тот факт, что SFC на самом деле имеет нечетные требования к опоре, не очевиден. Я хотел бы определить свой SFC самостоятельно, чтобы я мог использовать его в других ситуациях. Я просто перехожу за пределы ожидаемого варианта использования? Я делаю что-то неправильно?