2
type Field = {test: {more: number} | null}
let fields: Field[] = [{test: {more: 55}}]

无论类型保护如何,Transpiler 都会抛出错误:

if (fields[0].test) {
  fields[0].test.more = 55 // object is possibly null
} 

这里没有错误:

function f(field: Field) {
  if (field.test) field.test.more = 15 // no error
}
4

2 回答 2

4

类型流不跟踪数组索引访问,因此它不会记住您检查了0索引是否为null. 这被考虑过,但由于性能考虑显然没有实现您可以将值放在局部变量中,类型保护将按预期工作:

type Field = {test: {more: number} | null}
let fields: Field[] = [{test: {more: 55}}]
let d = fields[0];
if (d.test) {
    d.test.more = 55 // object is possibly null
} 
于 2018-04-17T13:13:28.293 回答
2

好吧,TypeScript 似乎没有跟踪数组索引中的空值,这有点奇怪......也许可以在 GitHub 上打开一个关于它的问题。无论如何,有一种方法可以防止该错误。一旦你做了那个检查,你就知道test不是null,所以你可以这样做:

if (fields[0].test !== null) {
  fields[0].test!.more = 55 // object is possibly null
}

!after将告诉编译器该test变量已定义并且与nullor不同undefined

于 2018-04-17T13:20:26.623 回答