【发布时间】:2019-08-03 06:37:02
【问题描述】:
在 TypeScript 中,我有时会使用期望(或返回)对象的函数,这些对象被视为字典。基本上我的问题是:这里使用的正确类型是什么?
我可以使用
Record<string, any>
但我在任何地方都找不到这个建议。相反,每个人都建议使用
{ [ key: string ]: any }
但是如果我这样做了,然后尝试访问一个属性,它的类型是 any,但它应该是 any |不明确的。 IOW,这种类型表明对于 any 给定的键将有一个值(这当然是错误的)。
我们现在最终创建了自己的 Dictionary 类型:
type Dictionary<K extends string, T> = {
[key in K]?: T;
}
但是,这似乎是我们想要实现的开销,因为这应该是一个非常普遍的要求。
当然也可以使用
{}
但这也允许数组,这是不想要的。
你如何正确解决这个问题?
PS:另一种选择可能是使用
{ [ key: string ]: any | undefined }
但这又看起来很麻烦。
PPS:这些示例并不完美,因为其中当然包含 undefined。在这里考虑任何其他类型,例如数字字典。
【问题讨论】:
-
附注...使用默认构造的对象作为字典是危险的,除非您不介意所有字典都包含键
"constructor"。 -
Record的实际定义与大家建议使用的非常接近。 typescriptlang.org/docs/handbook/advanced-types.html(我无法深层链接该页面,所以只需搜索“记录”)
标签: javascript typescript