我尝试使用以下模式:
enum Option {
ONE = 'one',
TWO = 'two',
THREE = 'three'
}
interface OptionRequirement {
someBool: boolean;
someString: string;
}
interface OptionRequirements {
[key: Option]: OptionRequirement;
}
这对我来说似乎很简单,但是我得到了以下错误:
索引签名参数类型不能是联合类型.请考虑改用Map得对象类型.
我做错了什么?
8条答案
按热度按时间xj3cbfub1#
您可以使用TS“in”运算符并执行以下操作:
oipij1gg2#
最简单的解决方案是使用
Record
您也可以自己将其实现为:
此构造仅适用于
type
,而不适用于interface
。定义中的问题是接口的键应该是
Options
类型,其中Options
是枚举,而不是字符串、数字或符号。key in Options
表示“对于联合类型Options中的那些特定键”。type
别名比interface
更加灵活和强大。如果您的型别不需要在类别中使用,请选择
type
而非interface
。up9lanfz3#
在我的例子中:
我通过使用
in
运算符而不是:
修复了它lmyy7pcs4#
我遇到过一些类似问题,但我的情况是接口中的另一个字段属性,因此我的解决方案是使用optional字段属性和键枚举的示例:
brjng4g35#
请使用Map的对象类型,而不要使用接口
eoxn13cs6#
在我的例子中,我需要属性是可选的,所以我创建了这个泛型类型。
然后按如下方式使用它:
范例
vsikbqxv7#
我也遇到过类似的问题。我试图在创建角形验证器时只使用特定的键。
用法:
这将允许使用1 - X个密钥。
vlju58qv8#
已编辑
TL;DR:使用
Record<type1,type2>
或Map对象,例如:我也遇到过类似的问题,问题是允许的键类型是字符串、数字、符号或模板文字类型。
因此,正如Typescript所建议的,我们可以使用Map的对象类型:
注意在一个Map对象中我们只允许使用字符串、数字或符号作为键,所以如果我们想使用一个特定的字符串(即枚举或联合类型),我们应该在索引签名中使用
in
关键字。这是用来引用枚举或联合中的特定属性。在一个真实的生活中的例子中,假设我们想要得到这样的结果,一个对象的键和值都是指定的类型:
为了使用Typescript实现这一点,我们应该创建不同的类型,然后在Record〈〉中实现它们,或者使用Map的对象类型:
这里我使用了枚举,但是这种方法对枚举和联合类型都有效。
(...)
而不是此[...]
)可能不会显示任何错误,但它表示一个完全不同的东西,一个函数接口,因此:实际上是在描述一个函数签名,例如: