打字稿为什么类型保护不能像预期的那样为类型为 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
之后的 !
将告诉编译器该变量已定义且不同于 null
或 undefined
。
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
之后的 !
将告诉编译器该变量已定义且不同于 null
或 undefined
。