Какие типы будут правильными для компонента React, который также может возвращать string
или напрямую их children
, кроме JSX.Element
? например:
type PropsStringExample = Readonly<{
returnString: boolean;
}>;
type PropsChildrenExample = Readonly<{
children: React.ReactNode;
returnChildren: boolean;
}>;
/*
Fails with: Type '{} | null | undefined' is not assignable to type 'ReactElement<any, any> | null'.
Type 'undefined' is not assignable to type 'ReactElement<any, any> | null'.
*/
const ComponentReturnsChildren: React.FunctionComponent<PropsChildrenExample> = ({
children,
returnChildren
}: PropsChildrenExample) => {
if (returnChildren) {
return children;
}
return (
<>
<div>Just a wrapper around the children</div>
{children}
</>
);
};
/*
Fails with: Type '"This component returns a string"' is not assignable to type 'ReactElement<any, any> | null'.
*/
const ComponentReturnsString: React.FunctionComponent<PropsStringExample> = ({
returnString
}: PropsStringExample) => {
if (returnString) {
return "This component returns a string";
}
return <div>Or also some dumb div</div>;
};
Обертывание возвращаемой строки фрагментом в последнем примере невозможно из-за некоторых ограничений eslint, т.е. <>"string"</>
CodeSandbox с примером ошибок: https://codesandbox.io/s/type-component-return-children-or-string-b956g?file= / src / index.tsx