对象类型标注

131 阅读2分钟

在TS中通常使用interface来对对象进行类型标注,通常的使用是用接口来定义一个类型结构,然后用这个结构来标注对象。比如:

interface person {
  name : string;
  age: number;
  male: boolean;
}

const p1 : person = {
  name: '张三',
  age: 22,
  male: true
}

对象里的属性必须和接口的类型一一对应,不能有多的属性,也不能有少的属性。我们也可以通过对象.属性名 = 值得形式进行访问和赋值,但是不能通过这种方式对对象进行初始化。

也可以对属性进行修饰比如使用可选和只读这两种。

修饰接口属性

我们在接口中可以通过?来定义可选属性

interface person {
  name: string;
  age: number;
  male?: boolean;
}

const p1 : person = {
  name: '张三',
  age: 22,
  male: true,
}

const p2 : person = {
  name: '李四',
  age: 23,
  male: undefined
}

const p3 : person = {
  name: '王二麻子',
  age: 23,
}

当一个属性被可选修饰符修饰之后,它的类型可以是定义的类型,也可以是undefined

如果可选的类型是函数属性,如果在对象中没有挂载具体的方法,然后直接进行调用会报错。

interface person {
  name: string;
  age: number;
  male?: boolean;
  eat?: Function;
}
​
const p : person = {
  name: '张三',
  age: 22,
}
​
p.eat('米饭')

但是并不影响对这个属性直接赋值

interface person {
  name: string;
  age: number;
  male?: boolean;
  eat?: Function;
}
​
const p : person = {
  name: '张三',
  age: 22, 
}
p.eat = (m:string) => {
  console.log(`吃${m}`);
}
​
p.eat('米饭')

就算对可选属性进行了赋值,TS还会用接口的描述为准进行类型查询,可以使用类型断言、非空断言以及可选链解决。

readonly把属性标记为只读属性,作用是防止对象的属性再次被赋值

interface person {
  readonly name: string;
  age: number;
}
​
const p1 : person = {
  name: '张三',
  age: 22
}
​
p1.name = '张老三';// 无法为“name”赋值,因为它是只读属性。

其实数组和元组都有只读属性,和对象有以下几个方面的不同:

  1. 只能把整个数组或元组标记为只读属性。
  2. 一旦被标记为只读属性,pushpop等方法都不能使用了,这实际上是把数组和元组变成了只读数组和只读元组。