接口(Interfaces)是一个很重要的概念,可以理解为一种规范或者约束,用来描述 对象(object) 的形状 或者对 类(class) 的行为 进行抽象。对类的行为抽象将在后面 类与接口 一章中介绍,下面主要介绍对对象的形状进行描述。

接口定义

定义接口的时候,只定义声明即可,不包含具体内容,接口一般首字母大写。有的编程语言中会建议接口的名称加上I前缀。

多一些属性也是不允许的,赋值的时候,变量的形状必须和接口的形状保持一致。

  1. // 定义一个接口 Person
  2. interface Person {
  3. name: string;
  4. age: number;
  5. }
  6. // 定义一个个变量,它的类型是 Person
  7. let hans: Person = {
  8. name: 'hans',
  9. age: 20
  10. };

可选属性

使用 ? 代表可选属性, 即该属性可以不存在, 但不允许添加未定义的属性

  1. interface Person {
  2. name: string;
  3. age?: number;
  4. }
  5. let hans: Person = {
  6. name: "hans"
  7. };
  8. // age为可选属性

任意属性

定义了任意属性后可以添加未定义的属性,并可以指定属性值的类型
一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集

  1. interface Person {
  2. name: string;
  3. age?: number;
  4. [propName: string]: any;
  5. }
  6. let hans: Person = {
  7. name: 'hans',
  8. gender: 'male'
  9. };

一个接口中只能定义一个任意属性。如果接口中有多个类型的属性,则可以在任意属性中使用联合类型

  1. interface Person {
  2. name: string;
  3. age?: number;
  4. [propName: string]: string | number;
  5. }
  6. let hans: Person = {
  7. name: 'hans',
  8. age: 20,
  9. gender: 'male'
  10. };

**

只读属性 readonly

有时候我们希望对象中的一些字段只能在创建的时候被赋值,那么可以用 readonly 定义只读属性
只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候,只读属性不能是可选属性,初始化的时候必须带有该属性

  1. interface Person {
  2. readonly id: number;
  3. name: string;
  4. age?: number;
  5. [propName: string]: any;
  6. }
  7. let hans: Person = {
  8. id: 10,
  9. name: 'hans',
  10. gender: 'male'
  11. };
  12. tom.id = 9527; // Error