打字稿3.0和对defaultProps做出反应

时间:2018-09-21 22:45:14

标签: reactjs typescript

如果我有一个这样定义的道具:

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而对其进行定义。打字稿无法解决这个问题。

反正让编译器知道它不能被未定义吗?

1 个答案:

答案 0 :(得分:2)

TL; DR没有将Layout道具定义为可选,打字稿将自行处理。

内部Layout道具不应该是可选的,因为defaultProps总是可以定义它:

interface Props {
  Layout: LayoutComponent;
}

对于外部用户,具有默认属性的任何属性都可以由LibraryManagedAttributes转换为可选属性

  

此帮助程序类型在用于检查针对它的JSX表达式之前定义了组件的Props类型的转换;这样就可以进行自定义,例如:如何处理提供的道具与推断的道具之间的冲突,如何映射推理,如何处理可选性以及应如何组合来自不同地方的推理