【发布时间】:2021-02-12 16:41:53
【问题描述】:
我有一个像这样的简单 React 组件:
interface ComponentProps {
onClick?: () => void;
}
const Component = (props: ComponentProps) => {
if (!props.onClick) {
return <></>;
}
return (
// Typescript complains: Cannot invoke an object which is possibly 'undefined'.ts(2722)
<button onClick={() => props.onClick()}>
test
</button>
);
};
Typescript 抱怨 props.onClick 可能未定义,即使在检查之后也是如此。
谁能帮我理解为什么 props.onClick 可能仍然可能是未定义的?
【问题讨论】:
-
您将
onClick()标记为可选,这意味着它可以是未定义的。尝试从您的界面中删除onClick()之后的问号。 -
我知道这是一个可选的,删除 ?让抱怨消失。但我的问题是为什么检查后 if (!props.onClick) return >; props.onClick 仍然可能未定义
-
那是因为你在回调中使用它。只需
<button onClick={props.onClick}> ... -
这是因为理论上在回调调用之前,一些其他代码可以更改道具并可能将
undefined分配给props.onClick。类似的问题stackoverflow.com/q/64334847/1113002 更多关于控制流分析的信息在这里github.com/microsoft/TypeScript/issues/9998 -
如果您使用解构
const Component = ({ onClick }: ComponentProps) => { ... }语法,它应该修复它,因为当onClick被这样解构时,您无法重新分配它。
标签: javascript reactjs typescript frontend