TypeScript ReactアプリケーションのPropTypes


121

React.PropTypesTypeScript Reactアプリケーションでの使用は意味がありますか、それとも「ベルトとサスペンダー」の単なる例ですか?

コンポーネントクラスはProps型パラメーターで宣言されているので、

interface Props {
    // ...
}
export class MyComponent extends React.Component<Props, any> { ... }

追加することには本当にメリットがありますか

static propTypes {
    myProp: React.PropTypes.string
}

クラス定義に?

回答:


104

通常、コンポーネントの小道具をTypeScriptタイプとして維持することとReact.PropTypes、同時に維持することには、あまり価値がありません。

以下は、そうすることが役立ついくつかのケースです。

  • プレーンJavaScriptで使用されるコンポーネントライブラリなどのパッケージを公開する。
  • API呼び出しからの結果などの外部入力を受け入れて渡す。
  • 存在する場合、適切または正確なタイピングがないライブラリからのデータを使用する。

したがって、通常は、コンパイル時の検証をどれだけ信頼できるかという問題です。

TypeScriptの新しいバージョンは、React.PropTypesPropTypes.InferProps)に基づいて型を推測できるようになりましたが、結果の型は、コード内のどこかで使用したり参照したりするのが難しい場合があります。


1
最初のステートメントについて説明していただけますか?
vehsakul 2017年

2
@vehsakul申し訳ありませんが、明確にするために、TypeScriptを使用していない開発者によってインストールされるパッケージを作成している場合でも、実行時にエラーが発生するためには、PropTypesが必要です。プロジェクトが自分自身/他のTypeScriptプロジェクト専用である場合、プロジェクトは単にビルドされないため、小道具のTypeScriptインターフェイスで十分です。
Joel Day

1
これは、WebpackレベルのtypescriptインターフェースからPropTypesを追加するPOCですgithub.com/grncdr/ts-react-loader#what-it-does
borN_free

oneOfTypeが必要です-optionalUnion:PropTypes.oneOfType([PropTypes.string、PropTypes.number、PropTypes.instanceOf(Message)])、-typescriptには共用体タイプがありますが、それらは私にまったく同じものを与えません
Mz A

1
私もこれを行うライブラリを公開しました:github.com/joelday/ts-proptypes-transformer TypeScriptコンパイラトランスフォームとして実装され、ディープジェネリック、ユニオンなどの正確なpropTypeを生成します。どんな貢献でも素晴らしいでしょう。
ジョエルの日

139

TypescriptとPropTypesは目的が異なります。Typescriptはコンパイル時に型を検証しますが、PropTypeは実行時にチェックされます

Typescriptは、コードを記述するときに便利です。間違った型の引数をReactコンポーネントに渡すと警告が表示され、関数呼び出しのオートコンプリートが提供されます。

APIからJSONをロードする場合など、コンポーネントが外部データとどのように相互作用するかをテストする場合、PropTypeは役立ちます。PropTypesは、コンポーネントが失敗している理由(Reactの開発モードの場合)をデバッグするのに役立ちます。

Warning: Failed prop type: Invalid prop `id` of type `number` supplied to `Table`, expected `string`

TypescriptとPropTypesは同じように見えるかもしれませんが、実際にはまったく重複していません。ただし、TypescriptからPropTypeを自動的に生成することができるので、タイプを2回指定する必要がありません。たとえば、


1
propTypesとTypescriptタイプは簡単に同期しなくなりますか?誰かが教えてくれるメンテナンス経験がありますか?
Leonardo

9
これが正解です。PropTypes(実行時)は、静的型チェック(コンパイル時)と同じではありません。したがって、両方を使用することは「無意味な練習」ではありません。
ハンス・

1
PropTypesから静的型を推論する方法についての良い説明は次のとおり
hans

ホットリロードとeslintを備えたVue CLIがある場合、ランタイムとコンパイル時間は意味がありません。保存時にエラーが発生します。
ジュリア

1
@Julia、ホットリロードはランタイムと共通点がありません。ホットリロードを使用しても、apiによって実際に返されるものの手がかりはありません
Kostya Tresko

4

コンパイル時に小道具のタイプを推測できないいくつかの厄介な状況ではpropTypes、実行時に使用することで生成された警告を確認すると役立つと思います。

そのような状況の1つは、制御が及ばない外部APIなど、タイプ定義が利用できない外部ソースからのデータを処理する場合です。内部APIについては、型定義がまだ利用可能でない場合は、それを記述(または、より適切には、生成)する価値があると思います。

それ以外は、特にメリットはありません(個人的に使用したことがないのはそのためです)。


7
PropTypes検証は、(AJAXを介してサーバーから)動的に読み込まれたデータ構造を検証することにも意味があります。PropTypesは実行時検証であるため、実際のデバッグに役立ちます。問題が明確で人間に優しいメッセージを出力するように。
e1v 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.