索引签名参数类型不能是文字类型或泛型类型
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; };
我们在
和类型中使用索引签名,但键的类型不是允许的类型之一,即、或模板文字类型。Status
StatusFromUnion
string
number
symbol
使用映射类型来解决错误
要解决该错误,请使用
映射类型。
索引.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 中文字类型的更多信息,请单击链接并按照说明进行操作。
额外资源
您可以通过查看以下教程了解有关相关主题的更多信息: