为什么TypeScript在使用www.example.com(-1)时会给我一个'Object is possible undefined'错误?array.at (-1)?

uqdfh47h  于 2023-05-23  发布在  TypeScript
关注(0)|答案(1)|浏览(186)

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)
mwg9r5ms

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和/或有副作用(包括修改数组本身)。使这段代码正确进行类型检查的方法是使用一个临时变量,它保证在检查和使用之间不会被修改,就像这样:

const temp = a.at(-1);
if (temp !== undefined)
    console.log(temp.x);

相关问题