Object vs object vs {}

TypeScript2.2 引入了被称为object类型的新类型,它用于表示非原始类型。在JavaScript中以下类型被视为原始类型:stringbooleannumberbingintsymbolnullundefined

所有其他类型均被视为非基本类型。新的object类型表示如下:

// 所有原始类型
type Primitive = string | boolean | number | bigint | symbol | null | undefined

// 所有非原始类型
type NoPrimitive = object;

使用object类型进行类型声明

// node_modules/typescript/lib/lib.es5.d.ts
interface ObjectConstructor {
  create(o: object | null): any;
  setPrototypeOf(o: any, proto: object | null): any;
  // ...
}

将原始类型作为原型传递给Object.setProptotypeOf()Object.create()将导致在运行时抛出类型错误。

const proto = {};

Object.create(proto); // OK
Object.create(null); // OK
Object.create(undefined); // Error
Object.create(1337); // Error
Object.create(true); // Error
Object.create("oops"); // Error

object 类型的另一个作用是作为ES2015的一部分引入的WeakMap数据结构。它的键必须是对象,不能是原始值。

Object 🆚 object 🆚 {}

Object 类型

Object 类型是所有 Object 类的实例的类型。它由以两个接口来定义:

  • Object 接口定义了 Object.proptype原型对象上的属性。

  • ObjectContractor接口定义了 Object 类的属性。

  1. Object 接口定义

  1. ObjectContructor接口定义

Object类的所有实例都继承了Object接口中的所有属性。

我们创建一个返回其参数的函数,传入一个Object对象的实例,它总是会满足该函数的返回值类型。

object类型,用于表示非原始类型。使用这种类型,我们不能访问值的任何属性。

Object vs object

类型 Object 包括原始值。相反object类型不包括原始值。当对Object的变量进行赋值时,如果对象属性名与Object接口中的属性冲突,则编译器会提示相应的错误。

而对于 object 类型来说,编译器并不会提示任何错误:

装箱和拆箱

空类型{}

空类型描述了一个没有成员的对象。当你试图访问这样一个对象的任意属性时,TypeScript 会产生一个编译时错误:

另外在使用Object.assign方法合并多个对象的时候,也会遇到以下问题:

这有帮助吗?