在TypeScript 2.2版本中,增加了一个新的object类型表示非原始类型。object类型使用object
关键字作为标识,object类型名中的字母全部为小写。示例如下:
const point: object = { x: 0, y: 0 };
object类型的关注点在于类型的分类,它强调一个类型是非原始类型,即对象类型。object类型的关注点不是该对象类型具体包含了哪些属性,例如对象类型是否包含一个名为name的属性,因此,不允许读取和修改object类型上的自定义属性。示例如下:
const obj: object = { foo: 0 };
// 编译错误!属性'foo'不存在于类型'object'上
obj.foo;
// 编译错误!属性'foo'不存在于类型'object'上
obj.foo = 0;
在object类型上仅允许访问对象的公共属性和方法,也就是Object类型中定义的属性和方法。示例如下:
const obj: object = {};
obj.toString();
obj.valueOf();
类型兼容性
我们知道,JavaScript中的数据类型可以划分为原始数据类型和对象数据类型两大类。针对JavaScript中的每一种原始数据类型,TypeScript都提供了对应的类型:
- boolean
- string
- number
- bigint
- symbol
- undefined
- null
但是在以前的版本中,TypeScript唯独没有提供一种类型用来表示非原始类型,也就是对象类型。前面介绍的Object类型无法表示非原始类型,因为允许将原始类型赋值给Object类型。例如,将字符串赋值给Object类型不会产生错误。示例如下:
const a: Object = 'hi';
新的object类型填补了这个功能上的缺失。object类型能够准确地表示非原始类型,因为原始类型不允许赋给object类型。示例如下:
let nonPrimitive: object;
// 下列赋值语句均会产生编译错误
nonPrimitive = true;
nonPrimitive = 'hi';
nonPrimitive = 1;
nonPrimitive = 1n;
nonPrimitive = Symbol();
nonPrimitive = undefined;
nonPrimitive = null;
只有非原始类型,也就是对象类型能够赋给object类型。示例如下:
let nonPrimitive: object;
// 正确
nonPrimitive = {};
nonPrimitive = { x: 0 };
nonPrimitive = [0];
nonPrimitive = new Date();
nonPrimitive = function () {};
object类型仅能够赋值给以下三种类型:
由于所有类型都是顶端类型的子类型,所以object类型能够赋值给顶端类型any和unknown。示例如下:
const nonPrimitive: object = {};
const a: any = nonPrimitive;
const b: unknown = nonPrimitive;
Object类型描述了所有对象都共享的属性和方法,所以很自然地表示对象类型的object类型能够赋值给Object类型。示例如下:
const nonPrimitive: object = {};
const obj: Object = nonPrimitive;
object类型也能够赋值给空对象类型字面量“{}”
。示例如下:
const nonPrimitive: object = {};
const obj: {} = nonPrimitive;
酷客网相关文章:
评论前必须登录!
注册