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...'.
私が最初にエラーに遭遇したとき、私は自分の小道具を定義するインターフェースを渡していないからだと思いましたが、それを作成しました(上で見ることができるように)、それはまだ動作しません。私は、私が行方不明になっているものがあるのだろうかと思っています。
ContainerComponentのコードからChildComponentプロパティを除外すると、(Childコンポーネントが重要なプロパティを持たないことを除いて)正常にレンダリングされますが、JSX TypeScriptではコンパイルが拒否されます。 この記事 に基づいた接続のラッピングと関係があると思いますが、その記事の問題はindex.tsxファイルで発生し、プロバイダーの問題であり、他の場所での私の問題。
したがって、いくつかの関連する回答(具体的には this one および this one を読んで、質問に対する@basaratの回答を見た後、自分に合ったものを見つけることができました。 (私の比較的新しいReactの目にとって)Connectのようなものは、コンテナコンポーネントに明示的なインターフェイスを提供していなかったので、通過しようとしている小道具によって混乱していました。
そのため、コンテナコンポーネントは同じままですが、子コンポーネントは少し変更されました。
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);
上記は私のために働くことができた。コンポーネントがコンテナに期待している小道具を明示的に渡すと、機能しているように見え、両方のコンポーネントが適切にレンダリングされました。
注:これは非常に単純な答えであり、なぜこれが機能するのか正確にはわからないので、より経験豊富なReact忍者この回答に関する知識を少し減らしたいので、修正させていただきます。