6.接口

接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用,接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法。(注意不要和前后端数据对接时使用的接口混淆)

基本语法:

interface 接口名称 {

}

示例代码:

interface Human {
   name: string;
   age: number;
   say(word: string): void
}

上面的代码,我们定义了一个接口,该接口规定,必须要有 nameage 属性,也必须要有一个 say 方法。

作为对象的类型注解

TS 中,接口可以作为对象的类型注解使用,可以将其看成是一些属性或者方法组成的特征集合。

interface Human {
   name: string;
   age: number;
   say(word: string): void
}

// smallMing 对象的类型注解使用了我们前面定义的接口,那么该对象的结构要和我们前面定义的接口类型要一样
let smallMing: Human;
smallMing = {
   name: '小明',
   age: 18,
   say: function (x) {
       console.log(x);
   }
}

console.log(smallMing);
smallMing.say('哈哈哈')

可选属性和只读属性:

interface Human {
  // 只读属性
   readonly name: string;
  // 可选属性
   age?: number;
}

索引签名:

前面我们编写的接口,键和值的结构都是固定的,但有时候,我们并不知道对象的键是什么,也不知道有多少个属性,只是知道键的类型和值的类型,这个时候我们就可以通过设置索引签名来进行约束。

interface Human {
   name: string,
   // 定义索引签名(xxx可以随意写)
   [xxx: number]: string
}

let h1: Human;
h1 = {
   name: '如花',
   // 符合索引签名规则的属性
   0: '我是随意的字符串',
   2: '我还是随意的字符串'
}
interface Human {
   name: string,
   // 定义索引签名,键虽然指定的是字符串类型,但后面用数值型的依然可以,因为会自动转换成字符串
   [xxx: string]: string
}

let h1: Human;
h1 = {
   name: '如花',
   // 符合索引签名规则的属性
   0: '我是随意的字符串',
   2: '我还是随意的字符串'
}

接口的继承

和我们在 JS 中学的类的继承一样,接口也可以通过继承其它接口来扩展自己。而且允许继承多个接口。

interface Human {
   name: string
}

interface Asia {
   age: number
}
// 继承Human接口和Asia接口
interface Chinese extends Human, Asia {
   sex: string
}

let smallMing: Chinese;
smallMing = {
   name: '小明',
   age: 18,
   sex: '男'
}

对“类”的约束

我们可以通过实现一个接口的形式去定义一个类。使用 implements 关键字即可。这中场景下,接口和抽象类有点类似,都可以对类的结构进行一定程度的约束,不过也有区别:抽象类可以包含成员的实现细节,而接口只能包含抽象部分,相对而言,接口比抽象类更加抽象。

interface Human {
   name: string
   run(): void
   say(word: string): void
}

interface Asia {
   age: number
}


class Chinese implements Human, Asia {
   // 接口中有的成员,必须要在类中实现
   name: string
   age: number
   constructor(name: string, age: number) {
       this.name = name
       this.age = age
   }

   run() {
       console.log('跑的挺快的');
   }

   say(word: string): void {
       console.log(word);
   }

   // 可以有自己的方法
   climb() {
       console.log('登高望远');
   }
}

函数接口

接口也可以用于描述函数的形状,也就是描述函数的参数列表,以及返回值类型。也主要用在类型注解时,用来约束函数的结构。

interface myFun {
   // 定义函数必须有两个形参, 函数的返回值必须是数值型
   // 形参1的类型是个字符型,形参2的类型是个数值型
   // 形参的名字可以随意,不过一般建议见名知意
   (x: string, y: number): number
}

// 指定变量f1的值必须是 myFun 类型的函数
let f1: myFun

// 符合接口描述的结构函数
f1 = function (a: string, b: number): number {
   return b + 100
}


微信 遇到疑问可加微信进行反映