对比一下Typescript中的{}和object和Object?

let a: {} = 1; // Ok
let b: object = 1; // Error
let c: Object = 1; // Ok,
阅读 9k
2 个回答

首先Object{}应该很好理解:

  1. Object: 一个对象,但是是包含了js原始的所有公用的功能。查看ts源码可以了解详情Object
  2. {}: 一个空对象实例,无原型链,但是原生的js Object属性和方法还是可以支持的
const obj01 = {};
const obj02 = Object;

console.log(obj01.prototype); // undefined
console.log(obj02.prototype); // ...
console.log(obj01.__proto__ === obj02.prototype); // true
console.log(obj01.toString()); // "[object Object]"

然后object:

  1. object: 可以理解为一个新的对象属性,ES6引入,可以看一下它的用例->WeakMap,同样是键值对集合,特殊在键值也必须是对象。
interface WeakMap<K extends object, V> {
  ...
}

我的理解是这样,希望能有所帮助:)

以下均假定strict=true

{} (type): 按照规范是 empty object type,但可以是primitive (即实际行为是除了null和undefined,可能是因为auto boxing)

Object (type): 同上

object (type): 除了primitives和null和undefined,即 "不autobox就已经是Object"

总之有点混乱,因为ts里除了正常的supertype/subtype还有个 "Assignment Compatibility"

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进