ts对象的类型–接口
1、简单的例子
interface Person {
name:string;
age:number;
}
let tom:Person = {
name:'Tom',
age:25,
}
接口一般首字母大写,定义的变量比接口少了一些属性是不允许的;多了一些属性也是不允许的;赋值的时候,变量的形状必须和接口的形状保持一致。
2、可选属性
有时我们不希望完全匹配一个形状,那么可以用可选属性
interface Person {
name: string;
age?:number
}
let tom:Person = {
name: 'Tom'
}
interface Person {
name: string;
age?:number
}
let tom:Person = {
name: 'Tom',
age: 16
}
由此可见,可选属性的含义是:可以不存在,但是仍然不允许添加未定义的属性
3、任意属性
有时候我们希望一个接口允许有任意的属性,可以使用如下的方式
interface Person {
name: string;
age?: number;
[proName:string]: string;
}
let tom:Person = {
name:'Tom',
age:16,
gender:'male'
}
使用[proName: string]定义了任意属性取string类型的值。
上例中,任意属性的值允许是 string,但是可选属性 age的值却是 number,number不是 string的子属性,所以报错了。
另外,在报错信息中可以看出,此时 { name: ‘Tom’, age: 25, gender: ‘male’ }的类型被推断成了 { [x: string]: string | number; name: string; age: number; gender: string; },这是联合类型和接口的结合。
一个接口中只能定义一个任意属性,如果接口中有多个类型的属性,则可以在任意属性中使用联合类型
interface Person {
name:sting;
age:number,
[propName:string]: string | number;
}
let tom:Person = {
name:'Tome',
age:16,
gender: 'male'
}
4、只读属性(readonly)
注意,只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候