首页 > 解决方案 > TypeScript:访问对象上未定义的键时返回的类型是错误的?

问题描述

在 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 向我展示了两者a 都有btype number。类型不应该是number | undefined因为它可能发生未定义键的情况吗?登录ab控制台时,a是一段number时间bundefined.

当一个类型的对象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 配置的,我没有更改任何设置)

标签: javascripttypescripttypes

解决方案


类型不应该是数字吗?而是未定义,因为可能会发生未定义键的情况?

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

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

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

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


推荐阅读