javascript - 打字稿:代码看起来一样,但它产生了一个错误
问题描述
我有一个这样的界面:
interface Product {
[key: string]: {
options?: Record<string, string>
}
}
所以:
state: Product
...
state = state ?? {}
state[sku] = state[sku] ?? {}
state[sku].options = state[sku].options ?? {}
state[sku].options[id] = e.target.value // this line breaks
上面突出显示的行表示state[sku].options
可能未定义,当然我知道不是未定义,因为我之前正在检查该行。
但是,此代码的功能完全相同,并且可以正常工作。
const newState = state ?? {}
const slice = newState[sku] ?? {}
slice.options = slice.options ?? {}
slice.options[id] = e.target.value
那么,我错过了什么?
解决方案
它是打字稿的限制。如果您创建如下类型:
type T = { [key: string]: string | undefined };
然后尝试:
var sth: T = { prop: "abc" };
sth.prop.slice()
你会得到一个错误,因为定义sth
仍然是general的T
。它并不关心其中一个 props ofsth
实际上是 a string
(也就是说,打字稿不会限制 的类型sth
)。
但是当你这样做时:
var u = { prop: "abc" };
u.prop.slice()
的类型u
将被限制为
{
prop: string
}
所以这里没有错误。
推荐阅读
- javascript - 仅在活动组件中打开的垫子对话框
- firebase - 如何在 Firebase.com 上报告网络钓鱼
- database - 如何在 PostgreSQL 中处理大型数据集?
- python - 如果输入剂量相等,则重新启动代码
- node.js - 在 Sequelize 中使用 map 创建一个新的普通对象
- c++ - 类公共函数引用私有数组
- c++ - 使用指针的分段错误
- json - 如何从python3中的json文件中读取xml部分?
- c# - 在 C# 中合并两个 XML 文档
- google-cloud-platform - 连接到托管在 Compute Engine 上的服务不起作用 - 无法访问站点/我已添加 http(s) 标签