我正在尝试使用带有es6 promise的TypeScript实现等效于bluebird's Promise.method
。如何在包装任意函数时保留类型信息
所需的使用:
const stringify = promiseMethod(JSON.stringify)
stringify(/* ... */) //Type checking available here, returns Promise<string>
最近实施:
const promiseMethod = function<T, U> (fn: (T) => U) {
if (typeof fn !== "function") {
throw new TypeError("Parameter is not a function:" + fn);
}
return <(T) => Promise<U>>function() {
try{
var value = fn.apply(this, arguments);
return Promise.resolve(value);
}
catch (error){
return Promise.reject(error);
}
};
};
上述实现的问题是调用点时,预计可能有许多只有一个参数。
如果我将参数和返回类型更改为Function
,但没有可用于参数或返回类型的类型信息,则可以获得可编译代码。
TypeScript支持签名重载。一个简单的方法来做到这一点,只是定义多个重载,每个不同数量的参数。 – Wazner