render
現在、React アプリケーションを TypeScript に移行しています。これまでのところ、これはかなりうまく機能していますが、関数、特に関数コンポーネントの戻り値の型に問題があります。
私は常に をJSX.Element
戻り値の型として使用してきましたが、コンポーネントが何もレンダリングしないnull
ことにした場合、つまり が の有効な値ではないためが返された場合、これは機能しnull
なくなりましたJSX.Element
。これが私の旅の始まりでした。私は Web で検索し、代わりに を使用する必要があることを発見しました。ReactNode
これには、null
発生する可能性のある他のいくつかのことが含まれます。
ただし、関数コンポーネントを作成すると、TypeScript はReactNode
型についてエラーを出します。再度検索してみると、関数コンポーネントの場合はReactElement
代わりに を使用する必要があることがわかりました。ただし、そうすると互換性の問題はなくなりますが、今度は TypeScript がnull
有効な値ではないと再度エラーを出します。
長い話を短くすると、3つの質問があります。
JSX.Element
、、ReactNode
およびの違いは何ですかReactElement
?render
クラス コンポーネントのメソッドは戻るReactNode
のに、関数コンポーネントのメソッドは戻るのはなぜですかReactElement
?- に関してこれをどのように解決すればよいでしょうか
null
?
ベストアンサー1
JSX.Element
、、ReactNode
およびの違いは何ですかReactElement
?
あReactElement
type
は、、、props
およびkey
プロパティを持つオブジェクトです。
interface ReactElement<
P = any,
T extends
| string
| JSXElementConstructor<any> = string
| JSXElementConstructor<any>,
> {
type: T;
props: P;
key: string | null;
}
あJSX.Element
は です。さまざまなライブラリが独自の方法でReactElement<any, any>
実装できるため存在します。JSX
declare global {
// …
namespace JSX {
// …
interface Element extends React.ReactElement<any, any> {}
// …
}
// …
}
あReactPortal
ReactElement
は次のプロパティを持つですchildren
:
interface ReactPortal extends ReactElement {
children: ReactNode;
}
あReactNode
はReactElement
、、、、、、、、または:string
number
Iterable<ReactNode>
ReactPortal
boolean
null
undefined
type ReactNode =
| ReactElement
| string
| number
| Iterable<ReactNode>
| ReactPortal
| boolean
| null
| undefined;
例:
<div> // <- ReactElement
<Component> // <- ReactElement
{condition && 'text'} // <- ReactNode
</Component>
</div>
クラス コンポーネントのレンダリング メソッドは ReactNode を返すのに、関数コンポーネントは ReactElement を返すのはなぜですか?
これは、に起因するものです歴史的な理由。
あComponent.render
を返しますReactNode
:
class Component<P, S> {
// …
render(): ReactNode;
// …
}
あFunctionComponent
を返しますReactElement<any, any> | null
:
interface FunctionComponent<P = {}> {
(props: PropsWithChildren<P>, context?: any): ReactElement<any, any> | null;
propTypes?: WeakValidationMap<P> | undefined;
contextTypes?: ValidationMap<any> | undefined;
defaultProps?: Partial<P> | undefined;
displayName?: string | undefined;
}
null に関してこれを解決するにはどうすればよいですか?
React と同じように入力しますReactElement | null
。または、TypeScript に型を推測させます。