索引签名参数类型不能是文字类型或泛型类型

索引签名参数类型不能是文字类型或泛型类型

An index signature parameter type cannot be a literal type or a generic type

当我们对索引签名参数使用不兼容的类型(例如联合或枚举)时,会出现错误“索引签名参数类型不能是文字类型或泛型类型”。

要解决该错误,请使用映射的对象类型。

以下是使用枚举时如何发生错误的示例。

索引.ts
enum EmailStatus { Read = 'READ', Unread = 'UNREAD', Draft = 'DRAFT', } type Status = { // ⛔️ Error: An index signature parameter type cannot be a literal type or generic type. // Consider using a mapped object type instead.ts(1337) [key: EmailStatus]: string; };

下面是使用联合类型时如何发生错误的示例

索引.ts
type EmailStatuses = 'Read' | 'Unread' | 'Draft'; type StatusFromUnion = { // ⛔️ Error: An index signature parameter type cannot be a literal type or generic type. // Consider using a mapped object type instead.ts(1337) [key: EmailStatuses]: string; };

我们在
和类型中使用
索引签名,但键的类型不是允许的类型之一,即或模板文字类型。StatusStatusFromUnionstringnumbersymbol

使用映射类型来解决错误

要解决该错误,请使用
映射类型

索引.ts
enum EmailStatus { Read = 'READ', Unread = 'UNREAD', Draft = 'DRAFT', } // 👇️ make sure you use type here (not interface) type Status = { [key in EmailStatus]: string; };

这是使用联合类型的映射类型的示例。

索引.ts
type EmailStatuses = 'Read' | 'Unread' | 'Draft'; // 👇️ make sure you use type here (not interface) type StatusFromUnion = { [key in EmailStatuses]: string; };

in请注意,我们在索引签名中使用关键字。

这用于引用枚举和联合中的特定属性。

使用映射类型时,请确保使用类型别名而不是接口

如果在接口中使用映射类型而不是类型别名,则会收到错误。

索引.ts
interface Status { // ⛔️ Error [key in EmailStatus]: string; };

我们使用映射类型来获取枚举和联合的所有属性,并将它们的值更改为类型string

使用Record实用程序类型来解决错误

解决该错误的另一种方法是使用Record实​​用程序类型。

索引.ts
// 👇️ Using Enums enum EmailStatus { Read = 'READ', Unread = 'UNREAD', Draft = 'DRAFT', } type Status = Record<EmailStatus, string>

Record这是将实用程序类型与联合类型一起使用的示例。

索引.ts
// 👇️ Using Union type type EmailStatuses = 'Read' | 'Unread' | 'Draft'; type StatusFromUnion = Record<EmailStatuses, string>

该代码示例实现了与使用映射类型的结果相同的结果。

Record

实用程序类型根据提供的键和值类型构造对象类型

如果您想了解有关
TypeScript 中
文字类型的更多信息,请单击链接并按照说明进行操作。

额外资源

您可以通过查看以下教程了解有关相关主题的更多信息: