1
以this StackOverflow post爲例,我實現了一個類型化的事件系統。簡化的,它看起來像:在TypeScript中映射泛型函數中的映射類型
interface MyTypeMap {
FOO: string;
BAR: number;
}
我試圖創建利用此地圖的事件處理程序:
function handleEvent<T extends keyof MyTypeMap>(eventKey: T, eventMsg: MyTypeMap[T]) {
switch(eventKey) {
case('FOO'):
// TS believes that eventKey is of type 'never'
// TS believes that eventMsg is 'string|number'
break;
case('BAR'):
// TS believes that eventKey is of type 'never'
// TS believes that eventMsg is 'string|number'
break;
}
}
打字稿的行爲時,該功能被外部調用預期。例如:
// These work as desired
handleEvent('FOO', 'asdf');
handleEvent('BAR', 5);
// These throw compile errors as desired
handleEvent('FOO', 6);
handleEvent('BAR', 'i am not a string');
但是,在函數TypeScript裏面很混亂。它似乎認爲沒有任何案例陳述能夠受到打擊。爲什麼TypeScript無法正確推斷函數內部的類型,雖然它在外部調用中可以正常工作?