一、可索引的介面
-
對陣列的約束
interface UserArr{
[index:number] : string
}
let arr:UserArr = ['aaa','bbb']
console.log(arr[0]) // aaa
複製程式碼
-
對物件的約束
interface UserObj{
[key:string]: string | number
}
const obj:UserObj = {
name: 'Leon',
age: 18
}
複製程式碼
二、函式型別介面
可以使用介面的方式來定義一個函式需要符合的形狀:
interface encrypt {
(key:string,value:string) : string
}
let md5:encrypt = (key:string,value:string):string {
return key+value
}
複製程式碼
encrypt這個介面規定了函式的傳參為key和value兩個變數,並且這兩個變數都是string型別。同時規定了函式的返回值也是string型別。
三、類型別介面
這類介面可以對類進行約束
-
implements
實現(implements)是物件導向中的一個重要概念。一般來講,一個類只能繼承自另一個類,有時候不同類之間可以有一些共有的特性,這時候就可以把特性提取成介面(interfaces),用 implements 關鍵字來實現。這個特性大大提高了物件導向的靈活性。
比如寫一個動物的類,它需要有name的屬性和eat的方法。
interface Animal{
name: string
eat(str:string):void
}
//可以用implements來實現這個類
class Dog implememts Animal {
name: string//ES6 中例項的屬性只能通過建構函式中的 this.xxx 來定義,ES7 提案中可以直接在類裡面定義:
constructor(name:string) {
this.name = name
}
eat() {
console.log(this.name+'吃骨頭')
}
}
let d = new Dog('小黑')
d.eat()//小黑吃骨頭
複製程式碼
一個類可以實現多個介面:
interface Alarm {
alert();
}
interface Light {
lightOn()
lightOff()
}
class Car implements Alarm, Light {
alert() {
console.log('Car alert')
}
lightOn() {
console.log('Car light on')
}
lightOff() {
console.log('Car light off')
}
}
複製程式碼
上例中,Car 實現了 Alarm 和 Light 介面,既能報警,也能開關車燈。
四、介面的擴充套件
-
介面的繼承
interface Animal{
eat():void
}
interface Person extends Animal{
work():void
}
class People implements Person {
public name:string
constructor(name:string) {
this.name = name
}
eat() {
console.log(this.name+'eat food')
}
word() {
console.log(this.name+ 'is coding')
}
}
let p = new People('leon')
p.work()
p.eat()
複製程式碼
-
介面實現類的繼承
class Programmer{
public name:string
constructor(name:string) {
this.name = name
}
coding(code:string) {
console.log(code)
}
}
interface People{
eat():void
}
class Men extends Programmer implements People {
constructor(name:string) {
super(name)
}
eat(){
console.log('eat food')
}
}
let m = new Men('小卡')
m.eat()
m.coding()
複製程式碼