TS-object、Object和{}

时间:2024-06-01 09:21:33

1.object

object(首字母小写)类型是TS中新增的类型,用于表示非原始类型

在TS中原始类型有number、boolean、string、bigint、symbol。

因此object表示除此以外的全部类型

以下赋值代码会引起编译错误

let a: object;
//编译错误:不能将类型"number"分配给类型"object"。ts(2322)
a = 1;
//编译错误:不能将类型"bigint"分配给类型"object"。ts(2322)
a = 1n;
//编译错误:不能将类型"boolean"分配给类型"object"。ts(2322)
a = true;
//编译错误:不能将类型"string"分配给类型"object"。ts(2322)
a = "";
//编译错误:不能将类型"symbol"分配给类型"object"。ts(2322)
a = Symbol();

以下为正确代码

let a: object;
a = { name: "hello" };
a = [0, 1, 2, 3];
a = function () { console.log("hello") };
a = new Date(); //时间对象,它是一种内置对象,后面将详细介绍

 注意:当对象为object类型时,因为object类型是一种泛指的类型,并不是具体的类型,因此无法得知它支持哪些属性或者方法,需要将其转换为具体的类型才能操作。

let a: object = [1, 2, 3, 4];
let b: object = { name: "rex" };
let c: object = function () { console.log("hello world!") }
 
//以下使用方式将引起编译错误
//编译错误:类型"object"上不存在属性"length"。ts(2339)
console.log(a.length);
//编译错误:类型"object"上不存在属性"name"。ts(2339)
console.log(b.name);
//编译错误:此表达式不可调用。类型 "{}" 没有调用签名。ts(2349)
c();
 
//以下是正确的使用方式
console.log((a as number[]).length);
console.log((b as { name: string }).name);
(c as () => void)();

object类型可用于参数传递过程中的处理。假设某函数要求传入任意非原始类型的数据,则可以将其定义为object类型而非any类型

function handleObject(obj: object) {
    //...
}

2.Object和{}

Object和{}类型都是TS中不推荐使用的类型,这两种类型主要用于JS,TS中只保留了他们的功能。

Obejct类型的字面意义是对象类型,{}类型的字面意义是没有属性或者方法的初始空对象类型。

但他们不进可以初始化为非原始数据类型,还可以初始化为原始类型。

这是一个人容易出错的设计

let a: Object; //或者let a: {};
a = 1;
a = 1n;
a = true;
a = "";
a = Symbol();
a = { name: "hello" };
a = [0, 1, 2, 3];
a = function () { console.log("hello") };
a = new Date();

与{}类型相比,Object类型还指出各种方法(Object.create()、Object.setPrototypeOf()方法等),这些方法通常用于原型的继承和处理。

但在TS中已经有了比较完善的接口和类,它们可以处理继承关系,因此无需使用这些落后的方式