noImplicitAny不适用于通用高阶函数

时间:2020-07-23 20:29:46

标签: typescript typescript-generics

在下面的代码段中,尽管有一个隐式键入为any的参数,但typescript不会发出任何错误。

declare function constrainedHOF<T extends (...args: any[]) => any>(callback: T): T;

// x is implicitly any, but typescript does not complain
const hof = constrainedHOF(x => {
    console.log(x);
});

我的猜测是问题出在类型约束T extends (...args: any[]) => any上,这使打字稿认为它是显式的any

如何正确解决此问题,既要使通用类型约束保持为“任何类型的函数”,又要使Typescript在any内部遇到意外的未键入回调时抱怨隐式constrainedHOF? / p>

在最新稳定的Typescript 3.9.2中进行了测试。

我准备了Playground Link来演示问题,其中包括检查问题是否确实与通用约束有关。

1 个答案:

答案 0 :(得分:1)

使用Function界面怎么样?

// according to your declaration, you return a function, is that correct?    
declare function callbackHOF<T extends Function>(callback: T): T

// @ts-expect-error noImplicitAny
const callbackHofNonTyped = someHOF(x => {
    console.log(x);
});

const callbackHofTyped = someHOF((x: number) => {
    console.log(x);
});

这是playground link