【发布时间】:2022-01-25 14:59:50
【问题描述】:
我想定义从数据库下载的对象类型。
type ActiveOrders = {[orderId: string]: {name: string; price: number}}
const activeOrders: ActiveOrders = {
'orderId1': {name: 'apple', price: 123},
'orderId2': {name: 'banana', price: 123},
'orderId3': {name: 'tesla', price: 99999999},
}
下面的代码没问题,我的orderData保证存在。
for(const orderId in activeOrders) {
const orderData = activeOrders[orderId]
// This is fine, orderData is guaranteed to exist
const {name, price} = orderData
}
这不好,但打字稿没有给我任何错误。 someRandomId 可以来自任何地方,例如用户输入的值。
const orderData2 = activeOrders['someRandomId']
// This is NOT fine, orderData2 is possibly undefined, but typescript says it is guaranteed to exist.
const {name, price} = orderData2
我可以将我的类型更改为跟随,但我想避免,因为它会弄乱我的 for-in 循环。
type ActiveOrders = {[orderId: string]: {name: string; price: number} | undefined}
有没有更优雅的解决方案?
【问题讨论】:
-
您要确保密钥始终以
orderId开头吗? -
您需要在 tsconfig 中使用
noUncheckedIndexedAccess选项,但这会使这两种情况都抛出错误。据我所知,没有办法让第一个工作而第二个失败 -
验证你的 orderIds 不是 Typescript 的工作——你已经告诉 Typescript 期望对象中有一个字符串 [orderId] 键,这是它唯一知道/关心的事情。然后验证 orderId 是您的工作;如果您担心可能会使用无效的 orderIds 来访问该对象,您应该相应地键入它(就像您使用
undefined所做的那样)。 -
@RameshReddy 不,我的 orderIds 是随机生成的
-
是的,当涉及类型联合时,打字稿将尝试确定某物是哪种类型。检查我的答案,了解使用条件类型执行此操作的方法
标签: typescript loops dictionary object undefined