typescript TS抱怨未定义的属性,即使是在if条件中

nue99wik  于 2023-01-31  发布在  TypeScript
关注(0)|答案(1)|浏览(156)

为什么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'.
    );
  }
}

这里是操场。

kmbjn2e3

kmbjn2e31#

您需要为要使用的data创建一个ref,并进行检查。
与此类似的东西:

function test(data: Data) {
  const st = data.st;

  if (st) {
    events = events.filter(
      (ce) => ce.st >= st
    );
  }
}

TS不能在这里缩小的主要原因是因为它实际上是unsound。您将回调传递到events.filter,并且不能保证您的回调会立即执行。(至少据我所知)来表示函数将执行同一次执行运行中提供的回调。在这种情况下,我们知道Array.filter可以做到这一点,但从TS的Angular 来看,这一点并不能得到保证。
第二个原因是TS无法正确跟踪对data的所有引用,以确定在检查时间和执行回调时间之间是否有其他代码段可能更改data.ts
如果你声明它为const,然后缩小它的范围,它实际上可以计算出来。
在这种情况下,还可以注意到关于回调的行为:

function test(data: Data) {
  let st = data.st;

  if (st) {
    events = events.filter(
      (ce) => ce.st >= st
    );
  }
}

现在你仍然会得到同样的错误,主要原因是回调调用,如果你在回调之前检查st类型,你会看到它被缩小到number,但是在回调内部它被扩大到number | undefined
您可以在此处查看第二个示例

相关问题