为什么TypeScript中初始化对象数组后仍可推入布尔值?
为什么TypeScript中
{}[]数组可以推入非对象类型值? 先看你给出的代码:
const arr: {}[] = [{}]; arr.push(false); // 未触发预期的类型错误
你预期的错误应该是:
Argument of type 'boolean' is not assignable to parameter of type '{}'.
问题原因
TypeScript里的{}类型不是“空对象”类型,它的实际含义是除null和undefined之外的所有值。因为在JavaScript中,boolean、string、number这类基本类型都有对应的包装对象,TypeScript认为这些值可以被当作{}类型的实例处理(比如你可以给false添加属性:(false as any).foo = 'bar'),所以这些类型都兼容{},自然能被推入{}[]类型的数组。
正确实现方式
如果你想定义一个**只能包含空对象(无任何可枚举属性的对象)**的数组,应该使用Record<string, never>[]或{ [key: string]: never }[]:
const arr: Record<string, never>[] = [{}]; arr.push(false); // 此时会触发预期错误:Argument of type 'boolean' is not assignable to parameter of type 'Record<string, never>'.
内容的提问来源于stack exchange,提问作者Yassine Farroud
相关产品推荐
相关产品推荐

