【发布时间】:2017-02-22 14:13:04
【问题描述】:
我有一个高阶函数,例如在 vanilla JS 中是这样的:
function log(fn) {
return (...args) => {
console.log("Calling", fn.name);
return fn(...args);
}
}
并像这样使用:
let name;
const setName = log((newName) => {
name = newName;
});
setName("Hello"); // output "Calling setName"
我怎样才能在 TS 中正确键入这个,以使 setName 具有正确的函数签名?含义:
setName("hello") // OK
setName() // Error, missing arg
setName(123) // Error, number not string
到目前为止,我想出的是:
function log<F extends Function>(fn: F): F {
return (...args: any[]) => {
console.log("Calling", fn.name);
return fn(...args);
}
}
let name;
const setName = log((newName: string) => {
name = newName;
});
按我想要的方式工作(我在 setName 上进行参数类型检查),但在 log 函数返回时出现编译错误:
错误:TS2322:Type '(...args: any[]) => any' 不可分配给类型 'F'。
即使我使用<F extends (...args: any[]) => any>,我也会遇到同样的错误。基本上不知道如何让返回的函数满足泛型类型F。
我该怎么做?
【问题讨论】:
标签: typescript