Typescript 为什么类型保护对于可空联合类型的对象数组不能按预期工作(启用 strictNullChecks)

Mar*_*zyk 2 typescript strictnullchecks

type Field = {test: {more: number} | null}
let fields: Field[] = [{test: {more: 55}}]
Run Code Online (Sandbox Code Playgroud)

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

if (fields[0].test) {
  fields[0].test.more = 55 // object is possibly null
} 
Run Code Online (Sandbox Code Playgroud)

这里没有错误:

function f(field: Field) {
  if (field.test) field.test.more = 15 // no error
}
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 5

类型流不会跟踪数组索引访问,因此它不会记住您检查了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
} 
Run Code Online (Sandbox Code Playgroud)