为什么TS在此代码中抱怨'data.st' is possibly 'undefined'.
,即使它在if条件中。
interface Data {
st?: number;
}
let events = [{id: 1, st: 123}, {id: 2, st: 465}];
function test(data: Data) {
if (data.st) {
events = events.filter(
(ce) => ce.st >= data.st, // 'data.st' is possibly 'undefined'.
);
}
}
这里是操场。
1条答案
按热度按时间kmbjn2e31#
您需要为要使用的
data
创建一个ref
,并进行检查。与此类似的东西:
TS
不能在这里缩小的主要原因是因为它实际上是unsound
。您将回调传递到events.filter
,并且不能保证您的回调会立即执行。(至少据我所知)来表示函数将执行同一次执行运行中提供的回调。在这种情况下,我们知道Array.filter
可以做到这一点,但从TS
的Angular 来看,这一点并不能得到保证。第二个原因是
TS
无法正确跟踪对data
的所有引用,以确定在检查时间和执行回调时间之间是否有其他代码段可能更改data.ts
。如果你声明它为
const
,然后缩小它的范围,它实际上可以计算出来。在这种情况下,还可以注意到关于回调的行为:
现在你仍然会得到同样的错误,主要原因是回调调用,如果你在回调之前检查
st
类型,你会看到它被缩小到number
,但是在回调内部它被扩大到number | undefined
。您可以在此处查看第二个示例