我正在嘗試使用帶有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