TypeScript 中类型“string”的重复索引签名

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类型中的字符串键使用了一个索引签名。

示例中的索引签名意味着当一个对象被一个字符串键索引时,它会返回一个类型为stringor或的值 numbernumber[]

现在我们可以在对象上设置值为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
or
number或 的值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

额外资源

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