[解決済み] タイプスクリプト React: コンポーネントのプロパティタイプにアクセスする
質問
npmパッケージ
@types/react
を使うと、TypeScriptアプリの中でReactを使うことができるようになります。
コンポーネントは
type Props = {...}
type State = {...}
export default class MyComponent extends React.Component<Props, State> {
}
ここでは、コンポーネントのプロップと状態(型変数)の型を宣言する必要があります。
型宣言をすると、TypeScriptはそれを使ってコンポーネントの使用状況(渡されたpropの形状)を検証します。
このようなコンポーネントの周りにコンテナを作りたいと思います。コンテナはコンポーネントのpropsを再利用することになります。しかし、同じプロップを持つ別のコンポーネントを作成するために、プロップの型を再度宣言する必要があります。または、元のコンポーネントファイルからそれらをエクスポートし、コンテナにインポートします。
// original file
export type Props = {...}
// container file
import MyComponent, { Props } from './original'
しかし、すでにインポートしている
MyComponent
をそのファイルからインポートしています。このコンポーネントは、消費するプロップについての情報をすでに持っています (タイプ変数のおかげで
React.Component
).
質問は の型を明示的にエクスポート/インポートすることなく、コンポーネントクラス自体からその情報にアクセスするにはどうすればよいでしょうか? ?
私は次のようなものが欲しいです。
import MyComponent from './MyComponent'
type Props = MyComponent.Props // <= here access the component prop types
export default class MyContainer extends React.Component<Props, {}> {}
どのように解決するのですか?
2019 : 上記のすべての回答がかなり古いことに気づいたので、ここに新しいものを紹介します。
ルックアップの種類
新しいTSバージョンでは、ルックアップタイプを使用することができます。
type ViewProps = View['props']
非常に便利であるにもかかわらず、それは はクラス・コンポーネントでのみ動作します。 .
React.ComponentProps(リアクト・コンポーネント・プロップス
Reactのtypedefsには、任意のコンポーネントからpropsの型を抽出するためのユーティリティが同梱されています。
type ViewProps = React.ComponentProps<typeof View>
type InputProps = React.ComponentProps<'input'>
これはもう少し冗長ですが、タイプ・ルックアップの解決策とは異なります。
- 開発者の意図がより明確である
- これは、機能コンポーネントとクラスコンポーネントの両方で動作します。
これらのことから、このソリューションは 最も将来性のある クラスからフックに移行することを決定した場合、クライアントコードをリファクタリングする必要はありません。
関連
-
[解決済み] バベルエラーです。JSX値は、式または引用されたJSXテキストのいずれかである必要があります。
-
[解決済み] reactstrapのドロップダウンで選択されたアイテムを設定する方法は?
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] ngModel' は 'input' の既知のプロパティではないため、バインドできません。
-
[解決済み] React JSX内のループ
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] TypeScript で `window` に新しいプロパティを明示的に設定するにはどうすればよいですか?
-
[解決済み] JSX.ElementとReactNodeとReactElementの使い分けは?
-
[解決済み】TypeScriptのインターフェースと型について
-
[解決済み】Reactの機能的なステートレスコンポーネント、PureComponent、Component、どのような違いがあり、いつ何を使うべきですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React 17で動作するEnzymeアダプターはどれですか?
-
[解決済み】React Propsが定義されていません。
-
[解決済み] バベルエラーです。JSX値は、式または引用されたJSXテキストのいずれかである必要があります。
-
[解決済み] リアクトです。<tr>は<td>の子として表示できません。コメント > td > tr を参照してください。
-
[解決済み] React-Router 4 キャッチオールルート
-
[解決済み] sh: react-scripts: npm start の実行後にコマンドが見つからない。
-
[解決済み] ReactコンポーネントのJest SnapshotテストにおけるSnapshotテストの仕組みとtoMatchSnapshot()関数は何をするのか?
-
[解決済み] 矢印本体を囲む予期せぬブロックステートメント
-
[解決済み] react-navigation v5を使ったreact-nativeアプリのAppNavigatorの構文を更新する。
-
[解決済み] Reactでグローバル変数を宣言する方法とは?