TypeScript中的介面

LeonVincent發表於2019-06-19

一、可索引的介面

  • 對陣列的約束
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()
複製程式碼

相關文章