索引签名参数类型不能是联合类型。请考虑改用映射的对象类型

2022-08-29 23:28:31

我正在尝试使用以下模式:

enum Option {
  ONE = 'one',
  TWO = 'two',
  THREE = 'three'
}

interface OptionRequirement {
  someBool: boolean;
  someString: string;
}

interface OptionRequirements {
  [key: Option]: OptionRequirement;
}

这对我来说似乎非常简单,但是我得到以下错误:

索引签名参数类型不能是联合类型。请考虑改用映射的对象类型。

我做错了什么?


答案 1

您可以使用 TS “in” 运算符并执行以下操作:

enum Options {
  ONE = 'one',
  TWO = 'two',
  THREE = 'three',
}
interface OptionRequirement {
  someBool: boolean;
  someString: string;
}
type OptionRequirements = {
  [key in Options]: OptionRequirement; // Note that "key in".
}

答案 2

最简单的解决方案是使用Record

type OptionRequirements = Record<Options, OptionRequirement>

您也可以自己实现它::

type OptionRequirements = {
  [key in Options]: OptionRequirement;
}

此构造仅对 可用,但不能。typeinterface

定义中的问题是说接口的键应该是 类型 ,其中是枚举,而不是字符串,数字或符号。OptionsOptions

表示“对于联合类型 Options 中的那些特定键”。key in Options

type别名比 更灵活、更强大。interface

如果不需要在类中使用您的类型,请选择 over 。typeinterface