[解決済み] TypeScript React.FC<小道具>の混乱
質問
TypeScriptを勉強しているのですが、いくつかの部分で混乱しています。以下はその一例です。
interface Props {
name: string;
}
const PrintName: React.FC<Props> = (props) => {
return (
<div>
<p style={{ fontWeight: props.priority ? "bold" : "normal" }}>
{props.name}
</p>
</div>
)
}
const PrintName2 = (props: Props) => {
return (
<div>
<p style={{ fontWeight: props.priority ? "bold" : "normal" }}>
{props.name}
</p>
</div>
)
}
上記の両方の機能コンポーネントについて、TypeScriptは同じJSコードを生成していることがわかります。その
PrintName2
コンポーネントは、可読性という点ではより合理的だと思います。この2つの定義の違いは何なのか、また、2つ目のタイプのReactコンポーネントを使用している人はいるのでしょうか?
どのように解決するのですか?
皆さん、回答ありがとうございます。正解なのですが、もっと詳細なバージョンを探していました。もう少し調べてみたところ、以下のようなものがありました。 React+TypeScript チートシート をGitHubで公開しています。
機能部品
これらは、propsの引数を取り、JSX要素を返す通常の関数として記述することができます。
type AppProps = { message: string }; /* could also use interface */
const App = ({ message }: AppProps) => <div>{message}</div>;
についてはどうでしょうか。
React.FC
/
React.FunctionComponent
?
でコンポーネントを記述することもできます。
React.FunctionComponent
(または省略形の
React.FC
):
const App: React.FC<{ message: string }> = ({ message }) => (
<div>{message}</div>
);
通常機能版と一部異なります。
のような静的プロパティに対してタイプチェックとオートコンプリートを提供します。
displayName
,
propTypes
および
defaultProps
- ただし、現在
defaultProps
と
React.FunctionComponent
. これを見る
問題
までスクロールしてください。
defaultProps
のセクションで推奨されるタイピングをご紹介しています。
しかし、暗黙的なchildrenの定義にはいくつかの問題があり (例: DefinitelyTyped#33006)、childrenを消費するコンポーネントについては、とにかく明示的にするのが良いスタイルと考えられるかもしれません。
const Title: React.FunctionComponent<{ title: string }> = ({
children,
title
}) => <div title={title}>{children}</div>;
将来的には、propsを自動的に読み取り専用にするかもしれませんが、propsオブジェクトがパラメータリストで破壊されていれば、それは無意味なことです。
React.FunctionComponent
は戻り値の型について明示的ですが、通常の関数バージョンは暗黙的です(さもなければ、追加のアノテーションが必要です)。
ほとんどの場合、どちらの構文を使ってもほとんど違いはありません。 しかし
React.FC
の構文は若干冗長になりますが を優先させました。 の構文にしました。
関連
-
[解決済み】Typescriptで、! (エクスクラメーションマーク/バン)演算子でメンバを再参照するのは?
-
[解決済み】HTMLの最初の行に予期しないトークン<がある。
-
[解決済み】未定義のプロパティ 'forEach' を読み取ることができない
-
[解決済み】Javascript、[オブジェクトHTMLInputElement]を表示中。]
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] TypeScript で `window` に新しいプロパティを明示的に設定するにはどうすればよいですか?
-
[解決済み] TypeScriptでの取得と設定
-
[解決済み] Reactのstateとpropsの違いとは?
-
[解決済み】TypeScriptのインターフェースと型について
-
[解決済み】 {this.props.children} に props を渡すには?}
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Heroku:ノードアプリで「このアプリにはデフォルトの言語が検出されませんでした」エラーがスローされる
-
[解決済み】TypeError: $(...).DataTable は関数ではありません。
-
[解決済み】React Js: Uncaught (in promise) SyntaxError: 位置 0 の JSON で予期しないトークン < が発生しました。
-
[解決済み】JavaScriptのisset()に相当するもの
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】React-Routerの子が1つしかない。
-
[解決済み】ES6マップオブジェクトをソートすることは可能ですか?
-
[解決済み】 \u003C とは何ですか?
-
[解決済み】JavaScriptで関数が存在するかどうかを確認する方法は?
-
[解決済み】module.exports "モジュールが定義されていません"