是否将Typescript中的索引签名的值显式声明为可选?

omvjsjqw  于 2023-10-22  发布在  TypeScript
关注(0)|答案(1)|浏览(108)

我声明了一个Typescriptobject作为索引签名({[k:t]: v})。当我访问它的一个元素而没有确保返回“undefined”时,我希望typescript将其标记为潜在错误:

let obj: { [x: number]: number } = {};
console.log(obj[123].toFixed());     // <-- I expect typescript warns me that obj[123] could be undefined!

但事实并非如此,尽管每个JavaScript对象都会有一些未定义的键,这些键返回undefined。因此,为了确保我得到警告,我必须声明obj如下:

let obj: { [x: number]: number|undefined } = {};

我的问题是:什么是 typescript 的惯用解决方案?总是加上“|“undefined”到索引签名的值?或者有没有其他方法可以确保编译器会警告我?

rhfm7lfc

rhfm7lfc1#

如果您希望TypeScript在使用索引签名属性值时警告您,而不首先检查undefined,则可以启用--noUncheckedIndexedAccess编译器选项。这会给你预期的错误:

let obj: { [x: number]: number } = {};
console.log(obj[123].toFixed());  // error!
// Object is possibly 'undefined'.

然而,这并不是“标准”--strict编译器选项套件的一部分是有原因的。事实证明,这使得一些惯用的JavaScript非常烦人:

function iterArr(arr: string[]) {
    for (let i = 0; i < arr.length; i++) {
        console.log(arr[i].toUpperCase()); // error!
        //Object is possibly 'undefined'.
    }
}

编译器无法区分索引签名类型的“好”索引和“坏”索引。您的选择基本上是将编译器配置为总是不安全地假设值存在,或者总是抱怨值可能不存在。
出于这个原因,我通常会关闭--noUncheckedIndexedaccess,并手动将undefined添加到您关心的类型的值的域中,就像您所做的那样:

let obj: { [x: number]: number | undefined } = {};

Playground链接到代码

相关问题