シンプルにした <If />
Reactを使用し関数コンポーネントを。
import React, { ReactElement } from "react";
interface Props {
condition: boolean;
comment?: any;
}
export function If(props: React.PropsWithChildren<Props>): ReactElement | null {
if (props.condition) {
return <>{props.children}</>;
}
return null;
}
次のようなよりクリーンなコードを記述できます。
render() {
...
<If condition={truthy}>
presnet if truthy
</If>
...
ほとんどの場合、問題なく機能しますが、たとえば、指定された変数が定義されていないかどうかを確認してから、それをプロパティとして渡したい場合は、問題になります。例を挙げましょう:
<Animal />
次の小道具を持つコンポーネントが呼び出されたとしましょう:
interface AnimalProps {
animal: Animal;
}
そして今、私は次のDOMをレンダリングする別のコンポーネントを持っています:
const animal: Animal | undefined = ...;
return (
<If condition={animal !== undefined} comment="if animal is defined, then present it">
<Animal animal={animal} /> // <-- Error! expected Animal, but got Animal | undefined
</If>
);
私がコメントしたように、実際には動物は定義されていませんが、Typescriptにチェック済みであることを伝える方法はありません。の主張animal!
はうまくいくでしょうが、それは私が探しているものではありません。
何か案は?
<Animal animal={animal as Animal} />
{animal !== undefined && <Anibal animal={animal} />}