我有以下内容:
interface LayoutProps {
children: React.ReactNode;
}
type LayoutComponent = React.ComponentType<LayoutProps>;
interface RootProps {
Layout?: LayoutComponent;
}
class Root extends React.Component<RootProps> {
static defaultProps: Pick<RootProps, 'Layout'> = {
Layout: ({ children }: { children: React.ReactNode }) => <>{children}</>
};
render() {
const { Layout, children } = this.props;
return (
<Layout> // when optional errors with JSX element type 'Layout' does not have any construct or call signatures.
{children}
</Layout>
);
}
}
ReactDOM.render(<Root>Foobar</Root>, document.getElementById('mount-node'));
打字稿并没有发现defaultProp
中有一个Layout
的事实,我认为这是由于新的LibraryManagedAttributes映射类型所致。
我正在使用@types/react@16.4.14
和打字稿3.0.3
。
当我认为整个点都是defaultProp时,Typescript抱怨Layout
无法被调用。
如果我添加此代码,那就可以了:
render() {
const { Layout, children } = this.props;
if (!Layout) {
return null;
}
return <Layout>{children}</Layout>;
}
我将strictNullChecks
设置为true。