传递给通用函数包装器(如_.debounce)的函数的类型推断

在TypeScript中,如果将函数表达式作为参数传递,则可以完美地推断出其参数的类型:

var foo = (fn: (a: string) => void) => {};

foo(a => { 
    // a is inferred to be a string
    alert(a.toLowerCase());
});

对于事件处理程序和其他回调而言,这确实很方便。但是,如果将函数表达式包装在通用包装函数的调用中,该调用将一个函数作为参数并返回具有相同签名(除了返回值)的函数(例如_.debounceLodash ),则不会发生推断。

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());
}));

TS游乐场

由于foo希望其论点是(a: string) => void,编译器可以尝试找到这样的类型,Tdebounce<T>将返回(a: string) => void但它不会尝试这样做。

我想念什么吗?是否应该debounce以其他方式编写类型注释是设计使然吗?GitHub上是否存在与此案有关的问题?

UPDATE-2017:现在可以使用!TS 2.5。

丹尼尔·罗森瓦瑟

首先,当您调用不带类型参数的泛型函数时,编译器必须找出每个类型参数的类型。

因此,当您调用时debounce,编译器必须找到的类型的候选T但是唯一debounce可以从中得出推论的地方是您的函数,并且没有为类型参数提供显式类型。

因此,编译器认为它没有任何类型可以使用,并回退到{}(“空类型”,通常仅称为“卷曲”)T

整个过程称为类型参数推断

然后发生的是,编译器将注意到您没有为arrow函数的参数指定类型。any它认为可以从debounce的参数类型中找出它,而不是默认为此过程称为上下文类型化

Wellfn的类型基本上是(a: {}) => void,因此编译器会得出“好的,很好,我们可以给出a一个类型!” 最终成为...{}不幸的是。


因此,虽然这并不是绝对出色,但修复并不是真的那么糟糕。只需为添加类型注释a

foo(debounce((a: string) => { 
    // Everything is fine!
    alert(a.toLowerCase());
}));

或使用类型参数:

foo(debounce<string>(a => { 
    // Everything is fine!
    alert(a.toLowerCase());
}));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

函数文字的类型推断

来自分类Dev

从传递的函数的返回值推断函数通用类型U

来自分类Dev

函数类型的Scala类型推断

来自分类Dev

在TypeScript中推断通用函数类型

来自分类Dev

将推断的类型传递给std :: find_if lambda函数

来自分类Dev

从函数参数推断类型参数

来自分类Dev

类型构造函数参数推断

来自分类Dev

无法推断函数返回类型

来自分类Dev

(>>)(>>)的类型推断(函数组成)

来自分类Dev

装饰器:参数如何传递给包装函数?

来自分类Dev

转发与不转发传递给包装器的函数

来自分类Dev

将图像从 python 包装器传递给 C++ 函数

来自分类Dev

高阶函数参数类型的类型推断错误

来自分类Dev

根据类型防护推断函数的返回类型

来自分类Dev

从函数返回类型推断模板参数类型

来自分类Dev

当包装器有相同的争论时,将kwarg传递给包装的函数

来自分类Dev

haskell中的函数组合类型推断

来自分类Dev

无法推断模板化ufcs函数的类型

来自分类Dev

推断可压缩HLists的函数类型

来自分类Dev

TypeScript中用于咖喱函数的类型推断

来自分类Dev

Haskell,多元函数和类型推断

来自分类Dev

从枚举参数推断Typescript函数返回类型

来自分类Dev

如何推断函数对象的返回类型?

来自分类Dev

不确定如何推断函数参数类型

来自分类Dev

推断可压缩HLists的函数类型

来自分类Dev

显式构造函数中的类型推断

来自分类Dev

从单个构造函数参数推断通用类类型参数

来自分类Dev

TypeScript:从错误的参数推断出通用函数类型参数

来自分类Dev

将参数传递给通用Class类型的构造函数