Arrays 为什么不';数组是否有字符串索引签名?

Arrays 为什么不';数组是否有字符串索引签名?,arrays,typescript,Arrays,Typescript,我有一个数组,我想通过向其添加属性将其作为对象重用。考虑下面的例子。 const arr=[“你好”、“我的”、“名字”、“是”]; arr.name=“彼得”; 在TypeScript中,可以使用索引签名键入。为了涵盖数字和字符串索引,我使用了更通用的字符串索引签名。但是,在尝试将数组分配给接口时,TypeScript会给出一个错误 接口字符串数组{ [索引:字符串]:字符串|编号; } const-arr:StringArray=[“Hi”、“my”、“name”、“is”]; //类型“

我有一个数组,我想通过向其添加属性将其作为对象重用。考虑下面的例子。

const arr=[“你好”、“我的”、“名字”、“是”];
arr.name=“彼得”;
在TypeScript中,可以使用索引签名键入。为了涵盖数字和字符串索引,我使用了更通用的字符串索引签名。但是,在尝试将数组分配给接口时,TypeScript会给出一个错误

接口字符串数组{
[索引:字符串]:字符串|编号;
}
const-arr:StringArray=[“Hi”、“my”、“name”、“is”];
//类型“string[]”不可分配给类型“StringArray”。
//类型“string[]”中缺少索引签名。(2322)
arr.name=“彼得”;
我在字符串索引签名中包含了
number
类型,因此
arr.length
也包括在内


我的理由如下。在JavaScript中,括号属性访问器中的数字索引被转换为字符串,即
arr[0]
被转换为
arr[“0”]
。有鉴于此,我希望字符串索引签名是数字索引签名的超集,这样它就可以覆盖所有数字索引以及字符串索引

换句话说,如果以下方法有效

接口编号排列{
[索引:编号]:编号;
}
常量arr:NumbersArray=[10,20,30];
那么这也应该起作用(但它不起作用)

接口编号排列{
[索引:字符串]:数字;
}
常量arr:NumbersArray=[10,20,30];
//类型“number[]”不可分配给类型“StringArray”。
//类型“number[]”中缺少索引签名。(2322)
由于这个原因,甚至声明数字索引签名的类型必须是字符串索引签名的子类型

从数值索引器返回的类型必须是从字符串索引器返回的类型的子类型

所以我的问题归结为以下几点

当字符串索引是数字索引的超集时,为什么数组在TypeScript中没有字符串索引签名

PS。我不想像数组上的任何那样使用类型断言来规避类型检查。请不要建议类型断言。

按设计不能有字符串索引:

interface Array<T> {  
    length: number;  
    [x: number]: T;  
    // Other members  
}

const arr:string[]和{name?:string}=…
?或者对于一个数组,索引类型应该是
[index:number]
@jornsharpe谢谢,但它只包含一个
名称
属性。我希望以后能够添加更多其他属性,但我还不知道这些属性的名称。在这一点上,您最好使用
any
。将TypeScript复制到生成的JavaScript中并查看生成的JavaScript是否不能为您提供“为什么”的答案?@jornsharpe不是真的,因为我可以说我想限制自己只能添加
string | number
类型的属性。谢谢你的解决方案。这可能是目前最好的方法,即使它仍然使用类型断言。然而,它仍然不能回答我最初的问题。如果字符串索引是数字索引的超集(因为数字索引转换为字符串),为什么字符串索引签名不包括数字索引签名。我用一个例子(在横线之后)编辑了我的问题,这个例子符合我的预期。哦,我现在明白了!字符串索引签名实际上只覆盖字符串索引,如
arr[“0”]
,而数字索引签名只覆盖数字索引,如
arr[0]
。数字索引签名的类型必须是字符串索引签名类型的子类型,因为
arr[0]
arr[“0”]
的缩写。我错误地假设数字索引签名所覆盖的索引是字符串索引签名所覆盖的索引的子集,而实际上它们是不相交集。
type StringArrayExt = Array<string> & { [index: string]: string };

let arr = ['Hi', 'my', 'name', 'is'] as StringArrayExt;
arr.name = 'Peter';