Javascript TypeScript中类似字典的对象使用什么类型?

Javascript TypeScript中类似字典的对象使用什么类型?,javascript,typescript,Javascript,Typescript,在TypeScript中,我有时有一些函数期望(或返回)对象,其中这些对象被视为字典。基本上我的问题是:这里使用的正确类型是什么 我可以用 Record<string, any> 但是如果我这样做了,然后尝试访问一个属性,它的类型是any,但它应该是any |未定义的。这种类型表明,对于任何给定的键,都会有一个值(这当然是错误的) 现在,我们最终创建了自己的字典类型: type Dictionary<K extends string, T> = { [key in

在TypeScript中,我有时有一些函数期望(或返回)对象,其中这些对象被视为字典。基本上我的问题是:这里使用的正确类型是什么

我可以用

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 }