通用介面

與類一樣,介面也可以接收多型引數(也稱為泛型)。

在介面上宣告通用引數

interface IStatus<U> {
    code: U;
}

interface IEvents<T> {
    list: T[];
    emit(event: T): void;
    getAll(): T[];
}

在這裡,你可以看到我們兩個介面需要一些通用的引數,TU

實現通用介面

我們將建立一個簡單的類,以實現 IEvents 介面。

class State<T> implements IEvents<T> {
    
    list: T[];
    
    constructor() {
        this.list = [];
    }
    
    emit(event: T): void {
        this.list.push(event);
    }
    
    getAll(): T[] {
        return this.list;
    }
    
}

讓我們建立一下 State 類的一些例項。

在我們的示例中,State 類將使用 IStatus<T> 處理通用狀態。通過這種方式,介面 IEvent<T> 也將處理 IStatus<T>

const s = new State<IStatus<number>>();

// The 'code' property is expected to be a number, so:
s.emit({ code: 200 }); // works
s.emit({ code: '500' }); // type error 

s.getAll().forEach(event => console.log(event.code));

這裡我們的 State 類被命名為 ISatus<number>

const s2 = new State<IStatus<Code>>();

//We are able to emit code as the type Code
s2.emit({ code: { message: 'OK', status: 200 } });

s2.getAll().map(event => event.code).forEach(event => {
    console.log(event.message);
    console.log(event.status);
});

我們的 State 型別為 IStatus<Code>。通過這種方式,我們可以將更復雜的型別傳遞給 emit 方法。

如你所見,通用介面對於靜態型別程式碼非常有用。