ts中的object
const obj = new Object()
Object
这里的Object是Object类型,而不是JavaScript内置的Object构造函数。
这里的Object是一种类型,而Object()构造函数表示一个值。
Object()构造函数的ts代码
interface ObjectConstructor{
readonly prototype: Object
// 忽略了其他成员
}
declare var Object: ObjectConstructor
Object类型是特殊对象Object.prototype的类型,该类型主要是描述JavaScript中几乎所有对象都共享(通过原型链继承)的属性和方法。
类型兼容性
除了undefined和null外,其他任何值都可以赋值给Object类型
let obj: Object;
obj = {x: 0}
obj = true
obj = "hi"
obj = 1
obj = undefined
obj = null
常见错误
const point: Object = {x: 0, y: 0} //不应该使用Object类型,而是应该使用object类型来代替
object
object表示非原始类型。
const ponit: object = {x: 0, y: 0}
强调的是一个非原始的类型,即对象类型,不关注对象类型中的属性
const obj: object = {foo: 0}
obj.foo// 编译错误,foo不存在于类型object上
obj.foo// 编译错误,foo不存在于类型object上
类型兼容性
javascript中的数据类型中可以划分为原始数据类型和对象数据类型两大类。
object类型仅能赋值给下面三种类型
- 顶端类型any和unknown
- Object类型
- 空对象类型字面量"{}"
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
实例应用
Object.create()该方法必须传入对象或者null值作为新创建对象的原型。
const a = Object.create(Object.prototype)
const b = Object.create(null)
// 类型错误
const c = Object.create(1)
对象类型字面量
对象类型字面量是定义对象类型的方法之一。
const point: {x: number, y: number} = {x: 0, y: 0}
基础语法
{
TypeMember;
TypeMember;
...
}
{
TypeMember,
TypeMember,
...
}
属性签名
{
PropertyName: Type;
}
let point : {x: number, y: number} = {x: 0, y: 0}
属性签名中的属性名可以为可计算属性名,但是条件如下
- 可计算属性名的类型为string字面量类型或者number字面量类型
- 可计算属性名的类型为"unique symbol"类型。
- 可计算属性名"Symbol.xxx"的形式
- 允许只列出属性名而不定义任何类型。在这种情况下,该属性的类型默认为any类型(启用–noImplicitAny 编译类型)
const a: 'a' = 'a'
const b: 0 = 0;
let obj: {
[a]: boolean;
[b]: boolean;
['c']: boolean;
[1]: boolean
}
const s: unqiue symbol = Symbol()
let obj: {
[s]: boolean
}
let obj: {
[Symbol.toStringTag]: string;
}
{
x;
y;
}
{
x:any;
y:any;
}
可选属性
{
PropertyName?: Type
}
{
let point: {x: number; y: number; z?: number}
}
point = {x: 0, y: 0}
point = {x: 0, y: 0, z: 0}
只读属性
只读属性的值在初始化后不允许再被修改
let point: {
readonly x: number;
readonly y: number
}
point = {x: 0, y: 0}
空对象类型字面量
const point: {} = {x: 0, y: 0}
point.x // 编译错误,x不存在于类型{}
point.y // 编译错误,y不存在于类型{}
point.valueOf()
let a: Object = 'hi'
let b: {} = 'hi'
a = b
b = a
全局的Object类型用于描述对象公共的属性和方法,它相当于一种专用类型,因此程序中不应该将自定义变量、参数等类型直接声明为Object类型。空对象类型字面量“{}”强调的是不包含属性的对象类型,同时也可以作为0bject类型的代理来使用