網站搜尋

泛型介面的陣列不相容的 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);
}