在 TypeScript 中,如果将函数表达式作为参数传递,则可以完美推断其参数的类型:
var foo = (fn: (a: string) => void) => {};
foo(a => {
// a is inferred to be a string
alert(a.toLowerCase());
});
这对于事件处理程序和其他回调非常方便。但是,如果函数表达式被包装在通用包装函数的调用中,该函数将函数作为参数并返回具有相同签名(返回值除外)的函数,例如_.debounce
Lodash,则不会发生推理。
var debounce = <T>(fn: (a: T) => void) => {
return (a: T) => { /* ... */ };
};
foo(debounce(a => {
// a is inferred to be {}
// type error: 'toLowerCase' doesn't exist on '{}'
alert(a.toLowerCase());
}));
由于foo
希望它的参数是(a: string) => void
,编译器可以尝试找到这样的类型,因为T
它debounce<T>
会返回(a: string) => void
。但它不会尝试这样做。
我错过了什么吗?我应该debounce
以其他方式编写类型注释吗?是设计使然吗?GitHub上有关于这个案例的问题吗?
UPDATE-2017:现在可以使用了!TS 2.5。