Typescript错误“Object is possibly 'undefined'.”当我使用
array.at(-1).key //array[array.length - 1].key
例如,下面的代码不会发生错误
class P {
public x: number
public constructor(x: number) {
this.x = x
}
}
const a = [new P(1)]
console.log(a[a.length - 1].x)
但是,下面的代码会发生错误
class P {
public x: number
public constructor(x: number) {
this.x = x
}
}
const a = [new P(1)]
console.log(a.at(-1).x)
当我检查值是否未定义时也会发生这种情况。
class P {
public x: number
public constructor(x: number) {
this.x = x
}
}
const a = [new P(1)]
if (a.at(-1) !== undefined) console.log(a.at(-1).x)
1条答案
按热度按时间mwg9r5ms1#
数组索引的方括号运算符自JavaScript诞生以来就存在了。在很长一段时间里,它是索引数组的唯一方法。是的,它为不存在的数组索引或对象键返回
undefined
。但是由于这个操作符在几乎所有代码中的普遍使用,以及检查索引结果是否是undefined
是多么冗长和烦人,TypeScript似乎决定打破严格的可靠性,假装结果不是undefined
。Array.at()
是ES 2022中引入的一个前沿新方法。事实上,我看到当前的TypeScript编译器严格对待方法的语义,并强制您检查结果是否为undefined
。至于为什么代码
if (a.at(-1) !== undefined) console.log(a.at(-1).x)
不起作用,这是因为common subexpression elimination不能被假定为一般有效。该方法可能是monkey-patched和/或有副作用(包括修改数组本身)。使这段代码正确进行类型检查的方法是使用一个临时变量,它保证在检查和使用之间不会被修改,就像这样: