Typescript为什么type guard对于null-able union类型的对象数组没有按预期工作(启用了strictNullChecks)

时间:2018-04-17 11:17:39

标签: typescript strictnullchecks

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
}

2 个答案:

答案 0 :(得分:3)

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

null

答案 1 :(得分:2)

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

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

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