接口(Interfaces)是一个很重要的概念,可以理解为一种规范或者约束,用来描述 对象(object) 的形状 或者对 类(class) 的行为 进行抽象。对类的行为抽象将在后面 类与接口 一章中介绍,下面主要介绍对对象的形状进行描述。
接口定义
定义接口的时候,只定义声明即可,不包含具体内容,接口一般首字母大写。有的编程语言中会建议接口的名称加上I前缀。
多一些属性也是不允许的,赋值的时候,变量的形状必须和接口的形状保持一致。
// 定义一个接口 Personinterface Person {name: string;age: number;}// 定义一个个变量,它的类型是 Personlet hans: Person = {name: 'hans',age: 20};
可选属性
使用 ? 代表可选属性, 即该属性可以不存在, 但不允许添加未定义的属性
interface Person {name: string;age?: number;}let hans: Person = {name: "hans"};// age为可选属性
任意属性
定义了任意属性后可以添加未定义的属性,并可以指定属性值的类型
一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集
interface Person {name: string;age?: number;[propName: string]: any;}let hans: Person = {name: 'hans',gender: 'male'};
一个接口中只能定义一个任意属性。如果接口中有多个类型的属性,则可以在任意属性中使用联合类型
interface Person {name: string;age?: number;[propName: string]: string | number;}let hans: Person = {name: 'hans',age: 20,gender: 'male'};
只读属性 readonly
有时候我们希望对象中的一些字段只能在创建的时候被赋值,那么可以用 readonly 定义只读属性
只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候,只读属性不能是可选属性,初始化的时候必须带有该属性
interface Person {readonly id: number;name: string;age?: number;[propName: string]: any;}let hans: Person = {id: 10,name: 'hans',gender: 'male'};tom.id = 9527; // Error
