【发布时间】:2016-06-07 09:49:42
【问题描述】:
在 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。
【问题讨论】:
-
我认为这只是类型推断系统的限制。它不能仅基于作为参数接收的函数的参数来推断泛型函数的类型。我在这里进一步探讨了这个问题:stackoverflow.com/questions/34531390/…
-
不要认为这是同一个问题。没想到它会从参数中推断出泛型函数的类型。我预计推断会发生在相反的方向,从 AST 的根到它的叶子。
标签: typescript type-inference typescript-generics