基本语法:
interface 接口名称 {
}
示例代码:
interface Human {
name: string;
age: number;
say(word: string): void
}
上面的代码,我们定义了一个接口,该接口规定,必须要有 name
和 age
属性,也必须要有一个 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
}