我有一個高階函數,例如:如何正確香草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
函數返回:
Error: TS2322:Type '(...args: any[]) => any' is not assignable to type 'F'.
即使我使用<F extends (...args: any[]) => any>
我得到同樣的錯誤。基本上,我不知道如何使返回的函數滿足通用類型F
。
我該怎麼做?
謝謝,我沒有想到使用這樣的函數重載。 – Aaron
我編輯與其他貢獻者的想法。 「功能」類型太寬。你的包裝函數必須是:'(... args:any [])=> any'。 – Paleo
有趣的,我試過'F延伸(...args:任何[])=>任何'與我原來的代碼,它仍然不允許我返回,即使有這個確切的簽名出於某種原因,和'作爲F'不能與'F extends Function'一起使用。老實說,我不明白爲什麼這是不同的,但它的工作原理。 – Aaron