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中已经有了比较完善的接口和类,它们可以处理继承关系,因此无需使用这些落后的方式