Object vs object vs {}
TypeScript2.2 引入了被称为object类型的新类型,它用于表示非原始类型。在JavaScript中以下类型被视为原始类型:string、boolean、number、bingint、symbol、null、undefined。
所有其他类型均被视为非基本类型。新的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"); // Errorobject 类型的另一个作用是作为ES2015的一部分引入的WeakMap数据结构。它的键必须是对象,不能是原始值。
Object 🆚 object 🆚 {}
Object 类型
Object 类型是所有 Object 类的实例的类型。它由以两个接口来定义:
Object接口定义了Object.proptype原型对象上的属性。ObjectContractor接口定义了 Object 类的属性。
Object接口定义
ObjectContructor接口定义
Object类的所有实例都继承了Object接口中的所有属性。
我们创建一个返回其参数的函数,传入一个Object对象的实例,它总是会满足该函数的返回值类型。
而object类型,用于表示非原始类型。使用这种类型,我们不能访问值的任何属性。
Object vs object
类型 Object 包括原始值。相反object类型不包括原始值。当对Object的变量进行赋值时,如果对象属性名与Object接口中的属性冲突,则编译器会提示相应的错误。
而对于 object 类型来说,编译器并不会提示任何错误:
空类型{}
空类型描述了一个没有成员的对象。当你试图访问这样一个对象的任意属性时,TypeScript 会产生一个编译时错误:
另外在使用Object.assign方法合并多个对象的时候,也会遇到以下问题:
这有帮助吗?