打字稿为什么类型保护不能像预期的那样为类型为 null-able union 的对象数组工作(启用 strictNullChecks)

Typescript Why type guard does not work as expected for array of objects of type null-able union(strictNullChecks enabled)

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

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

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
}

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

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
} 

好吧,似乎 TypeScript 没有跟踪数组索引中的空值,这有点奇怪……也许可以在 GitHub 上打开一个关于它的问题。无论如何,有一种方法可以防止该错误。进行检查后,您知道 test 不是 null,因此您可以:

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

test 之后的 ! 将告诉编译器该变量已定义且不同于 nullundefined