【发布时间】:2017-05-09 20:46:58
【问题描述】:
以this StackOverflow post 为例,我实现了一个类型化的事件系统。简化后看起来像:
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;
}
}
在外部调用此函数时,TypeScript 的行为与预期相同。例如:
// 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 无法正确推断函数内部的类型,尽管它在外部调用中运行良好?
【问题讨论】:
标签: generics typescript switch-statement typing inference