TypeScript object类型

在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;

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!