创新编码

不说话,装高手。

Maintain silence and pretend to be an experta

TypeScript中object、Object 和 {} 之间的区别

2024-06-23 17:06:57Typescript

在我们学习TypeScript的过程中发现,TypeScript定义了一些名字相似但是概念不同的类型,下面我们来一起讨论下object、Object 和 {} 之间的区别。

object

objectxa0类型他表示非原始对象,numberstringbooleansymbolnullundefined在JavaScript中为原始类型

使用object类型,就可以更好的表示像Object.create这样的API,在TypeScript2.2的发布,标准库的类型声明已经更新,以使用新的对象类型。例如,Object.create()xa0和Object.setPrototypeOf()xa0方法,现在需要为它们的原型参数指定xa0object | nullxa0类型:

折叠代码 复制代码
declare function create(o: object | null): void;

create({ prop: 0 }); // OK
create(null); // OK
create(42); // Error
create("string"); // Error
create(false); // Error
create(undefined); // Error

Object

TypeScript中还有一个跟objectxa0类型几乎同名的类型,他就是Object。该类型是所有 Object 类的实例的类型

用一句话来说Object就是一个对象,但是是包含了js原始的所有公用的功能。查看ts源码可以了解详情Object

在 TypeScript 中,我们使用接口来定义对象的类型,那么接口是什么???

在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用。接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可以满足实际需要。 typescrip中的接口类似于java,同时还增加了更灵活的接口类型,包括属性、函数、可索引和类等

  • Object 接口定义了 Object.prototype 原型对象上的属性
折叠代码 复制代码
// Object接口定义                                 
interface Person {                              
xa0 xa0 name: string;                                     
xa0 xa0 age: number;
}

let tom: Person = {
xa0 xa0 name: 'Tom',
xa0 xa0 age: 25
};  // success

let tom: Person = {
xa0 xa0 name: 11,
xa0 xa0 age: 25
};  // Error

Object 类的所有实例都继承了 Object 接口中的所有属性

记住!Object不是object,不要把他们两混淆

折叠代码 复制代码
let a: object
let b: Object

a = '1' // Error Type '"1"' is not assignable to type 'object'

a = {} // Success

b = '1' // Success

b = {} // Success

空类型 {}

空对象:它描述了一个没有成员的对象。当你试图访问这样一个对象的任意属性时,TypeScript 会产生一个编译时错误。但是,你仍然可以使用在 Object 类型上定义的所有属性和方法,这些属性和方法可通过 JavaScript 的原型链隐式地使用,例如:

折叠代码 复制代码
let a = {}

a.prop = '123' // Error Property 'prop' does not exist on type '{}'

a.toString() // "[object Object]"

在JavaSCript中给对象赋予属性很简单,但是在TypeScript中,这样写会报错

折叠代码 复制代码
// JavaScript
const a = {}; 
a.x = 3; 
a.y = 4;

// TypeScript
const a = {}; 
a.x = 3; // Error Property 'x' does not exist on type '{}'
a.y = 4; // Error Property 'y' does not exist on type '{}'

这是因为上面a的类型是根据 {}推断出来的,他能对已有的属性赋值。如果需要一步步创建对象,我们可以使用类型断言as来消除TYpeScript的类型检查

折叠代码 复制代码
const a = {} as Point;
a.x = 3
a.y = 4 // Success

更好的方法是声明变量的类型并一次性构建对象

折叠代码 复制代码
const a: Point = {
    x: 3,
    y: 4
}