通用介面
與類一樣,介面也可以接收多型引數(也稱為泛型)。
在介面上宣告通用引數
interface IStatus<U> {
code: U;
}
interface IEvents<T> {
list: T[];
emit(event: T): void;
getAll(): T[];
}
在這裡,你可以看到我們兩個介面需要一些通用的引數,T和 U 。
實現通用介面
我們將建立一個簡單的類,以實現 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 方法。
如你所見,通用介面對於靜態型別程式碼非常有用。