- 在TypeScript中,使用接口来定义对象的类型。
interface Person {
name: string;
age: number;
}
//定义变量tom,类型为Person
let tom: Person = {
name: 'Tom',
age: 25
}
定义的变量比接口少一些属性是不允许的
interface Person {
name: string;
age: number
}
//会报错
let tom: Person = {
name: 'Tom'
}
多一些属性也是不允许的:
interface Person {
name: string;
age: number
}
//会报错
let tom: Person = {
name: 'Tom',
age: 19,
gender: 'male'
}
可见,赋值的时候变量的形状必须和接口形状保持一致。
- 可选属性
有时候我们希望不要完全匹配一个形状,那么可以用可选属性(可选属性的含义是该属性可以不存在):
interface Person {
name: 'Tom';
age?: number;
}
//不会报错
let tom: Person {
name: 'Tom'
}
这时仍然不允许添加未定义属性:
let tom: Person = {
name: 'Tom',
age: 19,
gender: 'male' //不允许
}
- 任意属性
interface Person {
name: string;
age: number;
[propName: string]: any
}
注意:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。
interface Person {
name: string;
age?: number;
[propName: string]: string
}
let tom: Person = {
name: 'Tom',
age: 19, //报错,任意属性类型为string number不是string的子集
gender: 'male'
}
一个接口中只能定义一个任意属性。如果接口中有多个类型的属性,则可以在任意属性中使用联合类型。
interface Person {
name: string;
age?: number;
[propName: string]: string | number
}
- 只读属性
有时候我们希望对象中的一些字段只能在创建的时候被赋值,那么可以用readonly定义只读属性:
interface Person {
readonly id: number;
name: string;
age?: number;
[propName: string]: any
}
let tom: Person = { //id是必选属性,赋值时未赋值会报错
name: 'Tom',
gender: 'male'
}
tom.id = 0 //id为只读属性,初始化后不能再改