javascript - 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
都有b
type number
。类型不应该是number | undefined
因为它可能发生未定义键的情况吗?登录a
到b
控制台时,a
是一段number
时间b
是undefined
.
当一个类型的对象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 配置的,我没有更改任何设置)
解决方案
类型不应该是数字吗?而是未定义,因为可能会发生未定义键的情况?
如果你愿意,你可以选择;只需将其定义为:
type MyType = {
[x: number] : number | undefined
}
如果您希望访问可能不存在的随机属性,这将很有用。
但另一方面,以更规范的方式使用对象以避免访问不存在的属性的可能性是相当普遍的。例如,如果您通常编写使用Object.keys(o)
或for ... in
决定要访问哪些属性的代码,那么您已经在做确保它存在的工作,并且打字稿总是告诉您它可能是未定义的,这可能会令人沮丧。
推荐阅读
- python-3.x - tf.keras.optimizers.Adam 与 Tensorflow 2.0.beta 中的 tf.estimator 模型正在崩溃
- angular - 将参数传递给弹出对话框
- python - 使用 LSTM 进行样本外预测
- javascript - 智能手机键盘弄乱了页面布局
- python - 将多张图像与一张图像进行比较
- python - 在最终图像上应用轮廓蒙版
- swift - Firestore 并行查询持续时间随着查询数量的增加而增加(而且不应该)
- c++ - 仅在场景中的一个对象上设置纹理
- python - Python-OBD 大多数命令不支持
- sql-server - SQL Server 触发器插入/更新特定列