【问题标题】:What type to use for a dictionary-like object in TypeScript?TypeScript 中的类字典对象使用什么类型?
【发布时间】: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


【解决方案1】:

这个问题似乎至少有两部分,所以尝试分别回答:

{ [ key: string ]: any } 类型通常是正确的,值不需要写成any | undefined,因为any 类型是undefined 的父类型,所以any | undefined 在中简化为any结束。

然后正如 Tyler 在 cmets 中指出的那样,您的类型 Dictionary 涵盖了一个常见用例,这就是为什么它在标准库中几乎完全像 Record 那样实现的原因。所以是的,这是一个常见的要求,也是一个常见的答案。

【讨论】:

  • 正如我的 PPS 中所说,any 的示例有点不幸,但想想数字字典:number | undefined 绝对不仅仅是 number。所以,长话短说,如果我得到你的答案是正确的:如果你想确保你可以得到undefined,请使用Record,否则使用索引签名?
  • 确实如此。我现在不确定你想要达到什么水平的通用性。您能否在typescriptlang.org/play 上提供一个困扰您的案例的代码示例?
  • typescriptlang.org/play/#code/… ...为什么sales.asales.d被检测为number?这不应该是number | undefined吗(因为编译器无法知道ad是否真的存在)?
  • PS:我想我已经在一个新问题中总结了我的想法,所以在那里讨论答案可能更有意义:stackoverflow.com/questions/57337747/…
猜你喜欢
  • 2012-11-17
  • 1970-01-01
  • 2017-11-20
  • 2019-10-14
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 2020-07-16
  • 2017-08-04
相关资源
最近更新 更多