ts中的对象类型以及其基本功能

58 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

什么是对象类型?

在ts中通过对象类型来组织和传递数据,如

function storeObj(obj: {name: string,age: number}){}

其中 {name: string,age: number} 就是所谓的对象类型,限制传递给storeObj方法的数据只能具备字符串类型的name属性和数字类型的age属性。

属性描述符

ts中可以通过属性描述符对 对象类型 的属性进行控制,可以进行如下限制:

  1. 限制属性的类型
  2. 限制属性是否可选 通过?
  3. 限制属性是否只读 通过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} 就限制了传递过来的对象需要满足以下条件

  1. 必须具备字符串类型的name
  2. 可选的数值类型的age
  3. 只读的birthday属性

关于readonly需要注意事项

  1. readonly修饰的属性只会在ts类型检查时报错,而不影响其运行时期。如

image.png 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
  1. 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