创建了一个 “重学TypeScript” 的微信群,想加群的小伙伴,加我微信“semlinker”,备注重学TS。
本文是 ”重学TS“ 系列,第 27 篇文章,感谢您的阅读!
TypeScript 2.2 引入了被称为 object
类型的新类型,它用于表示非原始类型。在 JavaScript 中以下类型被视为原始类型:string
、boolean
、number
、bigint
、symbol
、null
和 undefined
。
所有其他类型均被视为非基本类型。新的 object
类型表示如下:
// All primitive types
type Primitive = string
| boolean | number
| bigint | symbol
| null | undefined;
// All non-primitive types
type NonPrimitive = object;
让我们看看 object
类型,如何让我们编写更精确的类型声明。
一、使用 object 类型进行类型声明
随着 TypeScript 2.2 的发布,标准库的类型声明已经更新,以使用新的对象类型。例如,Object.create()
和Object.setPrototypeOf()
方法,现在需要为它们的原型参数指定 object | null
类型:
// node_modules/typescript/lib/lib.es5.d.ts
interface ObjectConstructor {
create(o: object | null): any;
setPrototypeOf(o: any, proto: object | null): any;
// ...
}
将原始类型作为原型传递给 Object.setPrototypeOf()
或 Object.create()
将导致在运行时抛出类型错误。TypeScript 现在能够捕获这些错误,并在编译时提示相应的错误:
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 数据结构。它的键必须是对象,不能是原始值。这个要求现在反映在类型定义中:
interface WeakMap<K extends object, V> {
delete(key: K): boolean;
get(key: K): V | undefined;
has(key: K): boolean;
set(key: K, value: V): this;
}
二、Object vs object vs {}
也许令人困惑的是,TypeScript 定义了几个类型,它们有相似的名字,但是代表不同的概念:
object
Object
{}
我们已经看到了上面的新对象类型。现在让我们讨论 Object
和 {}
表示什么。
2.1 Object 类型
TypeScript 定义了另一个与新的 object
类型几乎同名的类型,那就是 Object
类型。该类型是所有 Object 类的实例的类型。它由以下两个接口来定义: