Javascript TypeScript中类似字典的对象使用什么类型?
在TypeScript中,我有时有一些函数期望(或返回)对象,其中这些对象被视为字典。基本上我的问题是:这里使用的正确类型是什么 我可以用Javascript TypeScript中类似字典的对象使用什么类型?,javascript,typescript,Javascript,Typescript,在TypeScript中,我有时有一些函数期望(或返回)对象,其中这些对象被视为字典。基本上我的问题是:这里使用的正确类型是什么 我可以用 Record<string, any> 但是如果我这样做了,然后尝试访问一个属性,它的类型是any,但它应该是any |未定义的。这种类型表明,对于任何给定的键,都会有一个值(这当然是错误的) 现在,我们最终创建了自己的字典类型: type Dictionary<K extends string, T> = { [key in
Record<string, any>
但是如果我这样做了,然后尝试访问一个属性,它的类型是any,但它应该是any |未定义的。这种类型表明,对于任何给定的键,都会有一个值(这当然是错误的)
现在,我们最终创建了自己的字典类型:
type Dictionary<K extends string, T> = {
[key in K]?: T;
}
但这也允许使用不需要的数组
如何正确地解决这个问题
PS:另一种选择可能是使用
{ [ key: string ]: any | undefined }
但这似乎又很麻烦
PPS:这些示例并不完美,因为其中任何一个当然都包括未定义的。想想这里的任何其他类型,例如数字字典 这个问题似乎至少有两个部分,所以试着分别回答: 类型
{[key:string]:any}
通常是正确的,并且值不需要写为any | undefined
,因为any
类型是undefined
的父类型,所以any | undefined
最终会减少为any
然后,正如泰勒在评论中指出的那样,您的类型
字典
涵盖了一个常见的用例,这就是为什么它在标准库中被实现为记录
。所以,是的,这是一个共同的要求,这是一个共同的答案。只是一个旁注。。。使用默认构造的对象作为字典是危险的,除非您不介意所有字典都包含键“constructor”
记录的实际定义与每个人建议使用的非常接近。(我无法深入链接该页面,所以只需搜索“记录”)正如我的PPS中所说的那样,any
的例子有点不幸,但想想数字字典:number |未定义的
肯定不仅仅是number
。因此,长话短说,如果我正确地得到了你的答案,那就是:使用记录
,如果你想确保你可以拿回未定义的
,否则就使用索引签名?确实如此。我现在不确定你想要达到什么样的泛型水平。您能提供一个困扰您的案例的代码示例吗?请看……为什么sales.a
和sales.d
被检测为number
?这不应该是number | undefined
(因为编译器不知道a
和d
是否确实存在)?PS:我想我已经在一个新问题中总结了我的想法,所以在这里讨论答案可能更有意义:
{}
{ [ key: string ]: any | undefined }