TS 中的类型“Y”中缺少类型“X”的索引签名

类型 ‘X’ 的索引签名在 TS 中的类型 ‘Y’ 中丢失

Index signature for type ‘X’ is missing in type ‘Y’ in TS

当 TypeScript 不认为使用索引签名的类型与更具体的类型兼容时,会出现错误“类型中缺少类型的索引签名”。

要解决该错误,请在调用函数时使用扩展语法 (…)。

类型中缺少类型的索引签名

下面是错误如何发生的示例。

索引.ts
interface Employee { name: string; country: string; } const employee: Employee = { name: 'Bobby Hadz', country: 'Germany', }; const accessEmployee = (employee: { [key: string]: string }) => { return employee['country']; }; // ⛔️ Error: Index signature for type 'string' // is missing in type 'Employee'.ts(2345) accessEmployee(employee);

该函数将包含索引签名的accessEmployee对象
作为参数。

示例中的索引签名意味着当用 a 索引对象时string,它将返回 a string

Employee接口定义了一个对象,namecountry属性为 type string

不幸的是,TypeScript 认为更具体的Employee类型与索引签名不兼容。

使用扩展语法 (…) 解决错误

解决这个问题的最简单方法是使用
扩展语法 (…)创建对象的浅表副本,并让 TypeScript 识别它是兼容类型。

索引.ts
interface Employee { name: string; country: string; } const employee: Employee = { name: 'Bobby Hadz', country: 'Germany', }; const accessEmployee = (employee: { [key: string]: string }) => { return employee['country']; }; // ✅ Works now accessEmployee({ ...employee }); // 👉️ "Germany"

我还写了一篇关于
如何创建对象的深拷贝的文章。

或者,使用类型别名

请注意,
使用
类型别名时不存在
此限制

索引.ts
// 👇️ Now using type alias type Employee = { name: string; country: string; }; const employee: Employee = { name: 'Bobby Hadz', country: 'Germany', }; const accessEmployee = (employee: { [key: string]: string }) => { return employee['country']; }; // ✅ Works now accessEmployee(employee); // 👉️ "Germany"

这不是错误,而是
设计
使然,因为接口可以通过额外的声明来扩充,而类型别名不能。

不能增加类型别名,因此推断类型别名的隐式索引签名比 interface 更“安全

如果您想阅读有关该主题的更多信息,请查看
TypeScript 存储库中的这个
GitHub 问题。

额外资源

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