今天来聊聊TS中的那些对象类型----TypeScript系列:(三) 对象类型
对象是我们组织数据的基本方式。除了常规的对象类型外,TS还提供了只读数组、元组、属性修饰符、索引签名等知识体系。在前面的章节中,我们已经了解到了对象的基本使用。可以用字面量、interface、type alias来规定一个普通的对象类型。现在是时候了解一下常用的对象属性修饰符、类型拓展、索引签名和内置的特殊对象类型了。 还没有对象吗?那就赶紧new一个吧!
文章目录
一、属性修饰符
利用属性修饰符,我们可以增强对象的属性的约束。
1. ? 可选属性
可选属性我们在之前就已经有所了解。定义对象类型时,在属性名后面加上英文问号 “?” ,表示该属性可选。此后,该类型的对象里可以有这个属性,也可以没有。因此,该属性除了我们给它约束了的类型之外,还可能是undefined,从而引发某些问题。在之前的文章中提到过,这可以通过真值校验来进行类型缩减,或者给函数的形参设置默认值,从而解决。
// 其中gender为可选属性
interface Person {
name: string,
age: number,
gender?: 1 | 2
}
// 可以有全部属性
const cc: Person = {
name: "cc",
age: 18,
gender: 2
}
// 可以缺失可选属性
const yy: Person = {
name: "yy",
age: 18
}
2. readonly 只读属性
在对象的某个或某些属性前加上关键字 readonly,可以设置该属性为只读属性。对象的只读属性在TS里一般不允许被重新赋值。只读属性不意味着完全不能修改。如果只读属性是一个对象类型,那我们可以修改它里面的成员。
// id为只读属性,不允许重新赋值
interface Person {
name: string,
age: number,
readonly idInfo: {
id: string,
addr: string
}
}
// 可以有全部属性
const cc: Person = {
name: "cc",
age: 18,
idInfo: {
id: "42xxxx199x04xxxx1X",
addr: "Wuhan"
}
}
// 下面这句会报错,因为cc的id信息被设置为只读属性,不可以被重新哦
cc.idInfo = {
id: "xiao cai ji", addr: "beijing"}
// 这样修改就可以啦
cc.idInfo.addr = "beijing"
然而事实上,在TS里我们依然有方法可以让只读属性被重新赋值。由于TS的类型检查机制,在检查两个对象类型是否兼容时,只针对类型,而不会去检测属性是否有 readonly 。例如,下面这两个对象类型是完全相互兼容的。
// id为只读属性,不允许重新赋值
interface Person {
readonly name: string,
readonly age: number,
readonly idInfo: {
id: string,
addr: string
}
}
// 没有readonly属性,所有成员都可以被赋值
interface People {
name: string,
age: number,
idInfo: {
id: string,
addr: string
}
}
// 注意Person的属性是只读的
let person: Person = {
na