Zrobiłem prosty <If />komponent funkcji za pomocą 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;
}
Pozwala mi napisać czystszy kod, taki jak:
render() {
...
<If condition={truthy}>
presnet if truthy
</If>
...
W większości przypadków działa dobrze, ale gdy chcę na przykład sprawdzić, czy dana zmienna nie jest zdefiniowana, a następnie przekazać ją jako właściwość, staje się to problemem. Podam przykład:
Załóżmy, że mam komponent o nazwie, <Animal />który ma następujące rekwizyty:
interface AnimalProps {
animal: Animal;
}
a teraz mam inny komponent, który renderuje następujący 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>
);
Jak skomentowałem, chociaż w rzeczywistości zwierzę nie jest zdefiniowane, nie mam sposobu, aby powiedzieć maszynopisowi, że już to sprawdziłem. Zapewnienie animal!by działało, ale nie tego szukam.
Jakieś pomysły?
<Animal animal={animal as Animal} />
{animal !== undefined && <Anibal animal={animal} />}zadziała