TypeScript中any[]与{ [s: string]: any }的差异及报错问题
TypeScript类型问题解答
1. 为何修改参数类型后代码正常运行?
你原来用any[]时,数组元素可以是任意类型(比如非对象、undefined),调用Object.values(e)会返回unknown[]——因为any没有明确结构,TypeScript没法保证返回值都是字符串,而unknown是类型安全的“任意类型”,不能直接赋值给string[],所以报错。
你改成的类型应该是漏写了数组符号[](否则a.map会直接报错),正确的应该是{ [s: string]: any }[]。这个类型明确了数组每个元素都是键为字符串、值任意的对象,此时Object.values(e)返回any[],any类型可以跳过TypeScript的类型检查,直接兼容string,所以any[]能被解构传入b.push(),不会触发错误。
2. { [s: string]: any }是什么类型?
这是TypeScript的字符串索引签名,意思是:
- 这个对象的所有属性名必须是字符串(JS里对象键最终都会转成字符串);
- 属性值可以是任意类型(
any)。
说白了就是“随便放键值对的对象”,只要键是字符串,值爱放啥放啥。
3. e?: any代表什么?
e?: any表示参数e是可选的,类型为any——也就是e可以是any类型的值,也可以是undefined。
你看到这个推断,是因为any[]没限制数组元素的存在性,TypeScript不确定数组里有没有元素、元素是不是undefined,所以map回调里的e会被推断成“可能有也可能没有”的类型。而用{ [s: string]: any }[]时,明确了数组元素都是对象,不会是undefined,所以e被推断成确定的e: any。
内容的提问来源于stack exchange,提问作者byronaltice
相关产品推荐
相关产品推荐

