TypeScript:高阶函数抛弃传入函数

时间:2017-08-27 11:42:23

标签: typescript higher-order-functions

使用更高阶函数,TypeScript似乎丢弃了有关传入函数的类型信息。例如,以下内容不会引发错误:

function func (f) {
    return f(1, 1);
}

function concat (n: string, m: string) {
    return n + m;
}

func(concat)

当然,如果您将相同的类型信息添加到更高阶函数,那么它将捕获错误:

function func (f: (n: string, m: string) => string) {
    return f(1, 1);
}

function concat (n: string, m: string) {
    return n + m;
}

func(concat)

错误:

error TS2345: Argument of type '1' is not assignable to parameter of type 'string'.

但是,有很多时候您可能希望传入具有任意签名的函数,并且稍后在更高阶函数中调用此签名时会遵循此签名。

我尝试使用类型参数实现此目的:

function func <F>(f: F) {
    return f(1, 1);
}

function concat (n: string, m: string) {
    return n + m;
}

func(concat);

但是,这也会引发错误:

error TS2349: Cannot invoke an expression whose type lacks a call signature. Type '{}' has no compatible call signatures.

有没有办法实现我想要实现的目标?

0 个答案:

没有答案