Typescript + React/Redux: свойство "XXX" не существует в типе "IntrinsicAttributes" и "IntrinsicClassAttributes"
Я работаю над проектом с Typescript, React и Redux (все работает в Electron), и у меня возникла проблема, когда я включаю один компонент на основе класса в другой и пытаюсь передать параметры между их. Наоборот, у меня есть следующая структура для контейнерного компонента:
class ContainerComponent extends React.Component<any,any> {
..
render() {
const { propToPass } = this.props;
...
<ChildComponent propToPass={propToPass} />
...
}
}
....
export default connect(mapStateToProps, mapDispatchToProps)(ContainerComponent);
И дочерний компонент:
interface IChildComponentProps extends React.Props<any> {
propToPass: any
}
class ChildComponent extends React.Component<IChildComponentProps, any> {
...
}
....
export default connect(mapStateToProps, mapDispatchToProps)(ChildComponent);
Очевидно, что я только включаю в себя основы, и для обоих этих классов гораздо больше, но я все еще получаю сообщение об ошибке, когда я пытаюсь запустить то, что выглядит для меня как правильный код. Точная ошибка, которую я получаю:
TS2339: Property 'propToPass' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes<Component<{}, ComponentState>> & Readonly<{ childr...'.
Когда я впервые столкнулся с ошибкой, я подумал, что это связано с тем, что я не передавал интерфейс, определяющий мои реквизиты, но я создал это (как вы можете видеть выше), и он все еще не работает. Мне интересно, есть ли что-то, что мне не хватает?
Когда я исключаю поддержку ChildComponent из кода в ContainerComponent, он отлично выглядит (кроме моего ChildComponent, не имеющего критической опоры), но с ним в JSX Typescript отказывается компилировать его. Я думаю, что это может иметь какое-то отношение к обертке подключений на основе этой статьи, но проблемы в этой статье произошли в файле index.tsx и были проблемы с провайдером, и я получаю свои проблемы в другом месте.
Ответы
Ответ 1
Итак, прочитав некоторые связанные ответы (в частности этот и этот и глядя на @basarat ответ на вопрос, мне удалось найти что-то, что работает для меня. Он выглядит (к моим относительно новым глазам React), например, Connect не предоставляет явный интерфейс для компонента контейнера, поэтому он был смущен опорой, которую он пытался pass.
Таким образом, компонент контейнера остался прежним, но дочерний компонент немного изменился:
interface IChildComponentProps extends React.Props<any> {
... (other props needed by component)
}
interface PassedProps extends React.Props<any> {
propToPass: any
}
class ChildComponent extends React.Component<IChildComponentProps & PassedProps, any> {
...
}
....
export default connect<{}, {}, PassedProps>(mapStateToProps, mapDispatchToProps) (ChildComponent);
Выше удалось работать для меня. Если явно передать реквизит, который компонент ожидает от контейнера, он работает, и оба компонента отображаются правильно.
ПРИМЕЧАНИЕ: Я знаю, что это очень упрощенный ответ, и я не совсем уверен, ПОЧЕМУ это работает, поэтому, если более опытный реактивный ниндзя хочет отказаться от некоторых знаний в этом ответе, я бы счастлив внести в него изменения.
Ответ 2
Вместо export default connect(mapStateToProps, mapDispatchToProps)(ChildComponent);
, выберите connect
decorator https://github.com/alm-tools/alm/blob/00f2f94efd3810af8a80a49f968c2ebdeb955399/src/app/fileTree.tsx#L136-L146
@connect((state: StoreState): Props => {
return {
filePaths: state.filePaths,
filePathsCompleted: state.filePathsCompleted,
rootDir: state.rootDir,
activeProjectFilePathTruthTable: state.activeProjectFilePathTruthTable,
fileTreeShown: state.fileTreeShown,
};
})
Здесь указано соединение https://github.com/alm-tools/alm/blob/00f2f94efd3810af8a80a49f968c2ebdeb955399/src/typings/react-redux/react-redux.d.ts#L6-L36
Почему?
Похоже, что используемые вами определения, вероятно, устарели или недействительны (возможно, недостаточно написаны).