【TypeScript】从零开始玩转TypeScript - TypeScript中的接口

前言

小伙伴们大家好。前几篇文章我们已经学习了TypeScript中的基本语法,数据类型以及类的抽象类。今天将继续学习TypeScript中的另一个知识点 - 接口。

不知道小伙伴们有没有了解过后端语言(像C#/Java等),相信了解过后端语言的小伙伴一定都知道接口的概念。那么TypeScript中的接口又是什么样的呢,有哪些用途,我们又该如何去使用它。下面就让我们来一探究竟!

接口

  • 接口的定义

抛开语言本身,不知道小伙伴们对接口是如何理解的。我个人理解是:接口就是一种标准一种规范。你如果想用我的功能,那必须要符合我的标准和规范。比如我们天天打交道的电脑,无论是台式机还是笔记本都会有一个或几个usb接口,想要使用外接键盘也好,鼠标也好,或者其它外接硬件等,都必须要插入USB口才能使用,那么这些外接硬件就必须要符合电脑USB接口所定义的标准和规范,否则是无法使用的。

那么我们再来看看TypeScript中的接口是如何定义的:接口是一系列的抽象方法的声明,是一些方法特征的集合,这些方法都是抽象的没有具体的实现。而是由要使用的类去实现这些方法,然后再在方法中编写一些符合规范的功能。还拿上面电脑的例子来说明:比如说鼠标和键盘想要接入电脑,那么必须要符合电脑对外提供的USB接口规范,而你具体要实现什么样功能则是由你自己决定。鼠标和键盘它们的相同点就是都实现了电脑的usb接口,但它们本身提供的功能却是不一样的,鼠标实现了点击功能而键盘实现了输入功能。

  • 接口的命名

接口命名一般以大写的字母“I”开头,然后后面再加一个能够代表接口类型的单词(单词首字母大写)。这种命名不是强制,但一般都会这样命名,因为这能够让我们一眼就知道它是个接口并且大概知道它是干嘛的。比如:IPerson、ICar、IAnimal等等。

  • 接口的作用/用途

TypeScript作为一门强类型的前端语言,它的核心设计原则就是:对值所具有的结构进行类型检测。而TypeScript中接口的作用就是:为这些类型命名和我们的代码或者第三方代码定义标准和规范(契约)

  • 接口的特点
  • 接口中可以定义属性也可以定义方法,但属性不能有具体的值,方法是抽象的不能有具体的实现
  • 接口可以作为数据类型使用,用于定义变量的数据类型
  • 接口可以作为类类型使用,供其它类通过implements关键字实现
  • 接口中定义的属性默认都是必选属性(一般作为类型使用时会用到)
  • 接口中可以通过**?**定义可选属性(一般作为类型使用时会用到)
  • 接口中可以通过readonly关键字设置只读属性
  • 接口可以继承接口,可单继承也可多继承(继承多个接口)
  • 接口可以继承类,它会继承类的成员,但不包括具体的实现,只会把类的成员作为一种声明。
  • 接口可定义可索引类型
  • 接口的使用

TypeScript跟其它后端语言一样,也是通过关键字interface去定义一个接口。接口的使用也有两种方式:

  • 通过冒号作为数据类型使用。比如我们前面将数据类型的时候提到:定义一个变量然后通过冒号(:)的形式去规定变量的数据类型。接口跟其它类型一样也可以作为一个变量的数据类型。如:let 变量:接口
  • 通过关键字implements供其它类实现使用:比如具有相同特征但不同行为的事物,就可以抽象为一个接口并在接口中定义这些相同的特征,然后再由具体的类去实现这个接口从而定义不同的行为。比如:人都有姓名、性别、年龄都会说话、吃饭、睡觉等,但具体叫什么名字,具体是什么性别,具体说什么话怎么吃饭怎么睡觉,不同的人就却是不一样的。那么我们就可以把这些相同的特征进行一个抽象定义成一个接口,然后具体的功能再由具体的人类去实现。下面我们用具体代码来实现一下:
// 定义一个人类的接口
interface IPerson{
    
    
	name:string
	age:number
	readonly sex:string //性别设为只读属性,一旦设置不能更改
	englishName?:string //英文姓名可以没有
	say(world:string):string
	run(km:number):number
}

//作为数据类型使用
let yannis:IPerson = {
    
    };//报错:Type '{}' is missing the following properties from type 'IPerson: name, age, sex, say, run

//正确用法:
let yannis:IPerson = {
    
    
	name:"Yannis",
	age:28,
	sex:'女',
	say(world:string):string{
    
    
		return world;
	},
	run(km:number):number{
    
    
		return km
	}
}

yannis.sex = '男';//报错:Cannot assign to 'sex' because it is a read-only property

// 实现接口
class Yannis implements IPerson{
    
    } //同样会报错:Class 'Yannis' incorrectly implements interface 'IPerson' ... 

//正确使用
class Yannis implements IPerson{
    
    
	name:string = 'Yannis'
	age:number = 28
	//sex:number = 1 //报错:类型不匹配
	sex:string = '女'
	say(world:string):string{
    
    
		return `hello ${
      
      world}`;
	},
	run(km:number):number{
    
    
		return km
	}
}
  • 接口继承接口

接口能够像类一样对接口进行继承,但不同的是类只能是单继承,而接口既可以实现单继承也可以多继承,多个接口以逗号分隔。多继承需要注意的是:如果继承的接口中有相同的属性(名称和类型)则直接继承,不同的属性(名称不同)则合并继承,但是如果属性名相同但类型不同,这个时候就不能实现多继承了(如继承的接口中都有age但一个是string一个是number,这种情况是不能同时继承的)

interface IPerson{
    
    
	name:string
	age:number
	sex:string
}

interface IEmployee{
    
    
	name:string
	high:number
	weight:number
}
//默认情况IYannis 会继承IPerson和IEmployee所有的属性
interface IYannis extends IPerson, IEmployee{
    
    
	
}
  • 接口继承接口

接口可以对类实现继承,但只能继承类的成员,不会继承类成员的实现。

class Person{
    
    
	name:string = 'Yannis'
	age: number = 28
	sayHi():void{
    
    
		console.log('Hello world');
	}
}

interface IPerson extends Person{
    
    
}

class Alvin extends Person implements IPerson{
    
    } // 不会报错,因为Alvin类继承了Person类,已经具有了Person中的成员,再去实现IPerson接口,即使不写内容也不会报错

class Yannis implements IPerson{
    
    }//报错,直接实现接口就会报错,因为接口继承了Person类,所以接口中的属性也应该在类Yannis中定义并实现

总结

本文以电脑为例引入了TypeScript中接口的概念,并对接口的作用,特点以及用法做了介绍和总结,最后还结合接口的特点给出了一些代码实例。其实掌握了接口的概念,特点以及用途后,接口使用起来并不是很难。

好了关于TypeScript中的接口就分享到这里了。喜欢的小伙伴欢迎点赞评论加关注哦!

Guess you like

Origin blog.csdn.net/lixiaosenlin/article/details/121204962