泛型介面的陣列不相容的 TypeScript 類型
我正在嘗試為我的應用程式建立自訂事件機制,但在定義準確類型時遇到困難。依我看,這些類型定義應該是正確的,但 Typescript 似乎無法推斷出監聽器陣列的正確類型。當我將監聽器陣列斷言為 const listeners=eventlisteners[kind] as XEventlistener<T>[] 時,它可以正常運作,但我不太喜歡在 Typescript 中使用斷言。有人能解釋為什麼 Typescript 無法推斷出該陣列的正確類型嗎?還是我的類型定義有錯?這是程式碼:
export const enum XEventTypes {
CONFIG_UPDATE,
ACTION_FINISHED
}
export type XEventListenerCollection = {
[T in XEventTypes]: XEventListener<T>[];
};
export interface XEvent<S extends XEventTypes> {
kind: S;
detail: DetailTypes[S];
}
export interface DetailTypes {
[XEventTypes.CONFIG_UPDATE]: string;
[XEventTypes.ACTION_FINISHED]: number;
}
export type XEventListener<T extends XEventTypes> = (event: XEvent<T>) => void;
const eventListeners: XEventListenerCollection = {
[XEventTypes.CONFIG_UPDATE]: [],
[XEventTypes.ACTION_FINISHED]: []
};
export function addEventListener<T extends XEventTypes>(kind: T, listener: XEventListener<T>): void {
// this doesn't compile without the assertion
const listeners = eventListeners[kind] as XEventListener<T>[];
if (listeners.indexOf(listener) > -1) {
return;
}
listeners.push(listener);
}