在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”赋值,因为它是只读属性。
其实数组和元组都有只读属性,和对象有以下几个方面的不同:
- 只能把整个数组或元组标记为只读属性。
- 一旦被标记为只读属性,
push和pop等方法都不能使用了,这实际上是把数组和元组变成了只读数组和只读元组。