TypeScript 中类型 ‘string’ 的重复索引签名
Duplicate index signature for type ‘string’ in TypeScript
当我们对同一类型的字符串键有多个索引签名时,就会出现“类型为‘字符串’的重复索引签名”错误。
string
要解决该错误,请仅对类型中的键使用单个索引签名。
下面是错误如何发生的示例。
索引.ts
type Person = { // ⛔️ Duplicate index signature for type 'string'.ts(2374) [name: string]: string; [country: string]: string; }; const obj: Person = { name: 'Bobby Hadz', country: 'Chile', };
该Person
类型有 2 个索引签名string
,用于导致错误的
类型的键。
语法
[name: string]: string
是一个索引签名,意味着当对象被一个string
键索引时,它将返回一个string
.我们不能为一个类型中的字符串键设置多个索引签名,因为它们会发生冲突。
使用联合类型解决错误
要解决该错误,请仅对类型中的字符串键使用单个索引签名。
索引.ts
type Person = { // 👇️ only 1 index signature [key: string]: string | number | number[]; name: string; country: string; }; const obj: Person = { name: 'Bobby Hadz', country: 'Chile', }; obj.years = [2022, 2023, 2024]; // 👇️ {name: 'Bobby Hadz', country: 'Chile', years: [2022, 2023, 2024]} console.log(obj);
我们只对Person
类型中的字符串键使用了一个索引签名。
示例中的索引签名意味着当一个对象被一个字符串键索引时,它会返回一个类型为
string
or或的值。 number
number[]
现在我们可以在对象上设置值为string
,number
或 的任何属性number[]
。
当我们事先不知道类型属性的所有名称,但我们知道值的形状时,使用索引签名。
string
我们指定当使用字符串键索引对象时,它返回类型为,number
或 的值number[]
。
因此,您不能将另一种类型的字符串属性添加到对象中,例如,具有返回boolean
.
索引.ts
type Person = { [key: string]: string | number | number[]; name: string; country: string; // ⛔️ Error: Property 'isProgrammer' of type // 'boolean' is not assignable to 'string' index // type 'string | number | number[]'.ts(2411) isProgrammer: boolean; };
我们试图向具有布尔值的类型添加一个isProgrammer
属性。Person
这里的问题是我们已经指定当一个类型的对象
Person
被一个字符串键索引时,它将返回一个类型为string
ornumber
或 的值number[]
。
我们不能添加另一个指向boolean
值的字符串键,而不将其添加到索引签名中的类型。
索引.ts
type Person = { [key: string]: string | number | number[] | boolean; name: string; country: string; isProgrammer: boolean; }; const obj: Person = { name: 'Bobby Hadz', country: 'Chile', isProgrammer: true, }; obj.years = [2022, 2023, 2024];
boolean
我们通过将类型添加到索引签名来解决错误。
在 TypeScript 中使用索引签名时,归结为了解string
键的索引签名必须涵盖键可能具有的所有类型
string
。
同一类型的字符串键不能有多个索引签名,因为它们会发生冲突。您必须使用
联合类型,例如
string | number | boolean
。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: