Ho creato un semplice <If />
componente di funzione usando 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;
}
Mi permette di scrivere un codice più pulito, come ad esempio:
render() {
...
<If condition={truthy}>
presnet if truthy
</If>
...
Nella maggior parte dei casi, funziona bene, ma quando voglio verificare, ad esempio, se una determinata variabile non è definita e quindi passarla come proprietà, diventa un problema. Faccio un esempio:
Diciamo che ho un componente chiamato <Animal />
che ha i seguenti puntelli:
interface AnimalProps {
animal: Animal;
}
e ora ho un altro componente che rende il seguente 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>
);
Come ho commentato, sebbene in realtà l'animale non sia definito, non ho modo di dire a Typescript che l'ho già controllato. L'asserzione di animal!
avrebbe funzionato, ma non è quello che sto cercando.
Qualche idea?
<Animal animal={animal as Animal} />
{animal !== undefined && <Anibal animal={animal} />}
avrebbe funzionato