我试着让这段代码起作用:
test(a: any[]) {
let b: string[][] = [];
b.push(Object.keys(a[0]));
b.push(...a.map(e => Object.values(e)));
}但是编译器不喜欢b.push(...a.map(e => Object.values)));行:"TS2345:'unknown[]‘类型的参数不能分配给'string[]’类型的参数。
但是,如果我将参数类型更改为test(a: { [s: string]: any }) {,这也是相同的代码,这是我偶然发现的。
我的问题是:
anya.map(e =>时,它推断e的类型是e?: any,而不是奇怪的类型,并且它用特殊的签名推断为e: any。e?: any是什么意思?发布于 2022-09-13 01:12:45
那个奇怪的类型到底是什么意思?
您指的是{ [s: string]: any }类型,它是一个索引签名
有时,您不知道一个类型的属性的所有名称,但您确实知道值的形状。 在这些情况下,可以使用索引签名来描述可能的值的类型()。
(强调地雷)
正如凯利在问题注释中所提到的,它描述了一个对象,没有多少关于其属性的信息,但是这些属性的值是any类型的。
为什么它适用于奇怪的类型?
实际上,如果您更愿意将参数a作为此类型的数组键入,则它“工作”:
function test2(a: { [s: string]: any }[]) { // Typed `a` as an array of objects with the "weird" type
let b: string[][] = [];
b.push(Object.keys(a[0]));
b.push(...a.map(e => Object.values(e)));
// ^? (parameter) e: { [s: string]: any; }
}a是一个数组,编译器知道a.map迭代该数组的项。这些项是值为any的对象,可分配给string。
https://stackoverflow.com/questions/73695029
复制相似问题