假設我有一個功能:
function registerEvent(event: Event, handler: HandlerSignature);
這些是各自的型別:
enum Event {
EventOne,
EventTwo
}
type HandlerSignature = (...args: any[]) => void;
現在每個事件都可以有不同的函式簽名,例如:
function handler1(foo: number, bar: string);
function handler2(foo: string);
我想要實作的是我可以呼叫該registerEvent函式,指定第一個 arg(事件)并讓 TypeScript 檢測與此事件對應的簽名,即用于智能感知并防止用戶為事件分配錯誤的簽名。
我想創建一個映射,在其中將不同的簽名分配給列舉值,但我不能真正將其用作型別,對嗎?即使我使用了映射型別,我也必須創建一個變數來分配所有事件。
uj5u.com熱心網友回復:
我傾向于函式多載:
enum Events {
EventOne,
EventTwo
}
type HandlerSignature = (...args: any[]) => void;
function registerEvent(event: Events.EventOne, handler: (foo: number, bar: string) => void): void;
function registerEvent(event: Events.EventTwo, handler: (foo: number) => void): void;
function registerEvent(event: Events, handler: HandlerSignature):void {
// ...implementation
}
function handler1(foo: number, bar: string) {}
function handler2(foo: string) {}
registerEvent(Events.EventOne, handler1); // Works
registerEvent(Events.EventOne, handler2); // Error as desired, wrong type for callback
游樂場鏈接
(請注意我改Event到Events;Event是一個預先存在的全域和型別在瀏覽器環境和Node.js的)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/343867.html
