javascript - TypeScript:访问对象上的未定义键时返回的类型错误?

标签 javascript typescript types

在 TypeScript 中使用带有可变键的对象时,我注意到了意外的类型。

给定以下代码

type MyType = {
  [x: number] : number
}

const o : MyType = {
  0: 1,
}

const a = o[0]; // Return type correctly identified as number
const b = o[1]; // Return type should be undefined and compiler should not allow this

我注意到当使用 [x: number] 语法定义对象类型时,未正确检测到使用 [...] 的对象访问类型用于可变键。

VSCode 向我显示 ab 都具有类型 number。类型不应该是 number | undefined 而不是因为可能会发生键未定义的情况?当将 ab 记录到控制台时,a 是一个 numberb 未定义

MyType 类型的对象被传递给一个函数并且该函数访问该对象中的一个键然后执行如下操作时,问题变得更加严重:

function fun(o: MyType) : number {
   return o[10000] ?? null  // can be number or null at runtime
}

没有显示错误。但是当代码运行时,o[10000] 是未定义的,因此返回值为 null,这不是一个有效的数字。想象一下,使用这个返回值来执行进一步的计算,这些计算都是基于一个有效数字的假设。这将导致编译器应该检测到的运行时错误(如果我不理解完全错误的东西,我是 TS 的新手)

(这些示例中使用的 TypeScript 由 create-react-app 配置,我没有更改任何设置)

最佳答案

Shouldn't the type be number | undefined instead because it can happen that a key is undefined?

如果你愿意,你可以选择;只需将其定义为:

type MyType = {
  [x: number] : number | undefined
}

如果您希望访问可能不存在的随机属性,这将很有用。

但另一方面,以更规范的方式使用对象是相当普遍的,这样可以避免访问不存在的属性的可能性。例如,如果您通常编写的代码使用 Object.keys(o)for ... in 来决定访问哪些属性,那么您已经做工作以确保它存在,并且让 typescript 总是告诉您它可能未定义可能会令人沮丧。

关于javascript - TypeScript:访问对象上的未定义键时返回的类型错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61493377/

相关文章:

javascript - 当离线或在线连接到互联网时,我如何更改我的图像,

javascript - .babelrc 配置放在 package.JSON

javascript - 如何使用正则表达式模式数组来检查 url

typescript - 直接从 npm 包导入 Typescript/JSX 代码

TypeScript:类型推断不正确

types - 将分隔的字段合并为一个

JavaScript 删除未知监听器

typescript - 扩展 'generic' TypeScript 接口(interface)

Java 泛型,强制使用文字类型

c++ - 命名空间中声明的数据类型的范围