【问题标题】:How can I use a type as the keys in an object type? [duplicate]如何使用类型作为对象类型中的键? [复制]
【发布时间】:2022-01-17 21:15:20
【问题描述】:

我有一个非常简单的界面:

interface FXRatesBySymbol {
  [key: string]: number;
}

不过,我想更具体地了解允许的键。

我有一个使用 template literals 创建的名为 CurrencyPair 的类型。

type CurrencyPair = "GBPGBP" | "GBPUSD" | "USDGBP" | "USDUSD"

我希望使用 CurrencyPair 作为该对象中键的类型。

interface FXRatesBySymbol {
  [key: CurrencyPair]: number;
} 

这失败了:

(parameter) key: "GBPGBP" | "GBPUSD" | "USDGBP" | "USDUSD"
An index signature parameter type cannot be a literal type or generic type. Consider using a mapped object type instead.

我已查找 object documentation 以了解映射对象类型是什么,但找不到提及映射对象类型的内容。

我还查看了mapped types 文档并尝试过:

interface FXRatesBySymbol {
  [Property in keyof CurrencyPair]: number;
}

但这是一个语法错误。

如何将类型用作对象类型中的键?

【问题讨论】:

  • 这不是枚举,它是字符串文字的联合(它们是字符串文字,而不是模板文字)。映射类型是{[K in X]: Y} 形式的类型,而您实际上只需要type FXRatesBySymbol = {[K in CurrencyPair]: number}type FXRatesBySymbol = Record<CurrencyPair, number>interface FXRatesBySymbol extends Record <CurrencyPair, number> {}
  • 我很想写一个答案(或者更有可能找到一个重复的答案),但我在移动设备上。有真正电脑的人可能会先到这里????
  • @jcalz 你说得对,我已经将问题固定为“类型”而不是枚举。
  • @jcalz 是的,您的答案有效(我自己也发现了)。现在只是想弄清楚如何使键成为可选...

标签: typescript enums


【解决方案1】:

自己解决了这个问题,发布一个答案来帮助别人:正确的语法是:

type FXRatesBySymbol = {
  [Property in CurrencyPair]?: number;
};

? 使键成为可选的。 mapped types 确实显示了这一点,但他们只有一个使用 keyof 的示例,所以我不得不对其进行调整以仅使用该类型。

【讨论】:

  • 谢谢!就是这样。
猜你喜欢
  • 2017-06-09
  • 1970-01-01
  • 2011-11-15
  • 2020-04-02
  • 2020-12-12
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 2021-05-22
相关资源
最近更新 更多