TypeScript中object、Object 和 {} 之间的区别
在我们学习TypeScript的过程中发现,TypeScript定义了一些名字相似但是概念不同的类型,下面我们来一起讨论下object、Object 和 {} 之间的区别。
object
object
类型他表示非原始对象,number
,string
,boolean
,symbol
,null
或undefined
在JavaScript中为原始类型
使用object
类型,就可以更好的表示像Object.create
这样的API,在TypeScript2.2的发布,标准库的类型声明已经更新,以使用新的对象类型。例如,Object.create()
和Object.setPrototypeOf()
方法,现在需要为它们的原型参数指定 object | null
类型:
1 | declare function create(o: object | null): void; |
Object
TypeScript中还有一个跟object
类型几乎同名的类型,他就是Object。该类型是所有 Object 类的实例的类型
用一句话来说Object
就是一个对象,但是是包含了js原始的所有公用的功能。查看ts源码可以了解详情Object
在 TypeScript 中,我们使用接口来定义对象的类型,那么接口是什么???
在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用。接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可以满足实际需要。 typescrip中的接口类似于java,同时还增加了更灵活的接口类型,包括属性、函数、可索引和类等
Object
接口定义了 Object.prototype 原型对象上的属性Object 类的所有实例都继承了 Object 接口中的所有属性1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// Object接口定义
interface Person {
name: string;
age: number;
}
let tom: Person = {
name: 'Tom',
age: 25
}; // success
let tom: Person = {
name: 11,
age: 25
}; // Error
记住!Object不是object,不要把他们两混淆
1 | let a: object |
空类型 {}
空对象:它描述了一个没有成员的对象。当你试图访问这样一个对象的任意属性时,TypeScript 会产生一个编译时错误。但是,你仍然可以使用在 Object 类型上定义的所有属性和方法,这些属性和方法可通过 JavaScript 的原型链隐式地使用,例如:
1 | let a = {} |
在JavaSCript中给对象赋予属性很简单,但是在TypeScript中,这样写会报错
1 | // JavaScript |
这是因为上面a的类型是根据 {}推断出来的,他能对已有的属性赋值。如果需要一步步创建对象,我们可以使用类型断言as
来消除TYpeScript的类型检查
1 | const a = {} as Point; |
更好的方法是声明变量的类型并一次性构建对象
1 | const a: Point = { |