接口
作用:
- 描述对象的形状
- 对类的一部分行为进行抽象
规则:
- 接口一般首字母大写
- 接口只支持声明对象类型
示例:
interface Person {
name: string;
age: number;
}
let user: Person = {
name: 'Ivan',
age: 25
};
这样就约束了 user 的形状必须和接口 Person 一致。
可选属性
在接口属性名称后面加?
即表示非必需。
interface Person {
name: string;
age?: number;
}
let user: Person = {
name: 'lolo'
};
只读属性
一些对象属性只能在对象刚刚创建的时候修改其值,使用readonly
指定只读属性。
interface User {
readonly name: string;
readonly age: number;
}
let my: User = { name: 'zgh', age: 24 };
my.age = 23; // Error
提示
数组也有只读属性,let arr: ReadonlyArray<number> = [1, 2, 3]
任意属性
当一个接口中有可选属性和只读属性时,还希望允许有其他的任意属性,可以用索引签名实现。
interface User {
name?: string;
readonly age: number;
[propName: string]: any;
}
let my: User = { name: 'zgh', age: 24, height: 183 };
[propName: string]: any
表示属性名称是字符串类型,值是任意类型。
注意:一旦定义了任意属性,那么确定类型和可选类型都必须是它的类型的子集。
interface Person {
name: string;
age?: number; // 报错
[x: string]: string;
}
这里任意属性是 string 类型,但是 age 属性是 number 类型,number 不是 string 的子集,所以报错。
将任意属性的类型设为 any 类型即可:
interface Person {
name: string;
age?: number;
[x: string]: any;
}