Я сделал простой <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>
);
Как я уже говорил, хотя на самом деле animal не определена, у меня нет возможности сообщить Typescript, что я его уже проверил. Утверждение animal!
будет работать, но это не то, что я ищу.
Любые идеи?
<Animal animal={animal as Animal} />
{animal !== undefined && <Anibal animal={animal} />}
, сработает