如果我有一个这样定义的道具:
interface Props {
Layout?: LayoutComponent;
}
然后,如果我在ClassComponent
上提供defaultProps:
class MyComp extends React.Component<Props> {
static defaultProps: Pick<Props, 'Layout'> = {
Layout: ({ children }) => <>{children}</>
};
}
Typescript不会接受无法定义的事实:
render() {
const { previousLocation, data } = this.state;
const { location, Layout } = this.props;
const initialData = this.prefetcherCache[location.pathname] || data;
return (
<Layout> // JSX element type 'Layout' does not have any construct or call signatures.
<Switch>
永远不要因为defaultProps
而对其进行定义。打字稿无法解决这个问题。
反正让编译器知道它不能被未定义吗?
答案 0 :(得分:2)
TL; DR没有将Layout
道具定义为可选,打字稿将自行处理。
内部Layout
道具不应该是可选的,因为defaultProps
总是可以定义它:
interface Props {
Layout: LayoutComponent;
}
对于外部用户,具有默认属性的任何属性都可以由LibraryManagedAttributes
转换为可选属性
此帮助程序类型在用于检查针对它的JSX表达式之前定义了组件的Props类型的转换;这样就可以进行自定义,例如:如何处理提供的道具与推断的道具之间的冲突,如何映射推理,如何处理可选性以及应如何组合来自不同地方的推理