开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情
什么是对象类型?
在ts中通过对象类型来组织和传递数据,如
function storeObj(obj: {name: string,age: number}){}
其中 {name: string,age: number} 就是所谓的对象类型,限制传递给storeObj方法的数据只能具备字符串类型的name属性和数字类型的age属性。
属性描述符
ts中可以通过属性描述符对 对象类型 的属性进行控制,可以进行如下限制:
- 限制属性的类型
- 限制属性是否可选 通过?
- 限制属性是否只读 通过readonly
如
function storeObj(obj: {name: string,age?: number, readonly birthday: string}){
obj.birthday = 'abc' //Cannot assign to 'birthday' because it is a read-only property
}
其中 {name: string,age?: number, readonly birthday: string}
就限制了传递过来的对象需要满足以下条件
- 必须具备字符串类型的name
- 可选的数值类型的age
- 只读的birthday属性
关于readonly需要注意事项
- readonly修饰的属性只会在ts类型检查时报错,而不影响其运行时期。如
2. readonly只检查直接修饰的属性是否改变。如
type Person = {
readonly birthday: { content: string }
}
let person:Person = {
birthday: {
content: "birthday"
}
}
person.birthday.content = "New Birthday"
person.birthday = {} //Cannot assign to 'birthday' because it is a read-only property
- ts在检查两种类型是否相同时,会忽略readonly属性。
type ReadOnlyPerson = {
readonly name: string;
readonly age: number;
}
type Person = {
name: string;
age: number;
}
let person:Person = {
name: "JoeZhou",
age: 18
}
let rp:ReadOnlyPerson = person; //这里ts忽视了ReadOnlyPerson的readonly关键字,允许Person类型赋值给ReadOnlyPerson类型
person.age++ //这里通过person对象改变了rp中readonly的age属性,且类型检查期间不会报错
ts不支持结构赋值的时候同时指定对象类型,因为这与js的结构赋值语法冲突,如
function objType({age: number = -1}){
console.log(number)
}
其中{age: number = -1}表示解构赋值传递过来的对象,将age属性赋值给number变量,number变量的默认值为-1