首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘any[]’和‘{ [s: string]:any }’有什么区别?

‘any[]’和‘{ [s: string]:any }’有什么区别?
EN

Stack Overflow用户
提问于 2022-09-12 20:40:12
回答 1查看 45关注 0票数 0

我试着让这段代码起作用:

代码语言:javascript
复制
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 }) {,这也是相同的代码,这是我偶然发现的。

我的问题是:

  • 为什么它适用于奇怪的类型?
  • 那个奇怪的类型到底是什么意思?这听起来像是胡言乱语,它是一个键的对象(类型数组?)哪个映射到any
  • 当调用a.map(e =>时,它推断e的类型是e?: any,而不是奇怪的类型,并且它用特殊的签名推断为e: anye?: any是什么意思?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-13 01:12:45

那个奇怪的类型到底是什么意思?

您指的是{ [s: string]: any }类型,它是一个索引签名

有时,您不知道一个类型的属性的所有名称,但您确实知道值的形状。 在这些情况下,可以使用索引签名来描述可能的值的类型()。

(强调地雷)

正如凯利在问题注释中所提到的,它描述了一个对象,没有多少关于其属性的信息,但是这些属性的值是any类型的。

为什么它适用于奇怪的类型?

实际上,如果您更愿意将参数a作为此类型的数组键入,则它“工作”:

代码语言:javascript
复制
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

操场连接

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73695029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档