【发布时间】:2018-02-02 16:30:05
【问题描述】:
interface PageProps {
foo?: Function;
bar: number;
}
export class PageComponent extends React.Component<PageProps, {}> {
public static defaultProps: Partial<PageProps> = {
foo: () => alert('Did foo')
};
private doFoo() {
this.props.foo(); // Typescript Error: Object is possibly 'undefined'
}
public render(): JSX.Element {
return (
<div>
<span>Hello, world! The number is {this.props.bar}</span>
<button onClick={() => this.doFoo()}>Do the Foo</button>
</div>
);
}
}
有没有办法告诉 Typescript props.foo 将总是被定义?
有一个很好的SO question and answer 讨论了如何正确定义组件上的道具类型。它甚至讨论了如何让 TS 知道 stateless 组件上的 defaultProps。
但是,Typescript 仍然会在常规组件定义中抱怨您的 props 可能未定义(如我上面的示例所示)。
您可以使用 bang (this.props.foo!()) 调用它,这可以防止 TS 抛出错误,但它也可以防止对您传入的任何内容进行任何类型的检查。在上面的示例中,没什么大不了的.在更复杂的代码中,它已经咬了我。
所以我目前正在实施这样的事情:
private doFoo() {
if (this.props.foo) this.props.foo();
}
这有一个缺点,我认为这很重要:它使我的代码有点混乱。实际上,我总是想调用this.props.foo(),但似乎,如果不更仔细地研究类,在doFoo 方法中什么都不会发生的情况。 (是的,我可以添加一条评论,解释 if 只是为了让 Typescript 高兴,但我宁愿我的代码在可能的时候自己说话。)
当我实际上需要从 this.props.foo() 返回某些内容时,我的代码变得更加复杂。
我目前正在使用 @types/react 进行类型定义。
【问题讨论】:
标签: reactjs typescript