【发布时间】: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