ich eine Funktion höherer Ordnung, müssen sie beispielsweise in Vanille JS wie folgt aus:Wie man richtig eine Funktion höherer Ordnung
function log(fn) {
return (...args) => {
console.log("Calling", fn.name);
return fn(...args);
}
}
und verwendet wie folgt aus:
let name;
const setName = log((newName) => {
name = newName;
});
setName("Hello"); // output "Calling setName"
Wie kann ich richtig eingeben dies in TS so, dass setName
hat die richtige Funktion Signatur? Bedeutung:
setName("hello") // OK
setName() // Error, missing arg
setName(123) // Error, number not string
Was ich mit so weit kommen habe, ist:
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;
});
, die die Art und Weise funktioniert Ich will (I Argument Typen auf setName
Kontrolle zu bekommen), aber ich erhalte einen Compiler-Fehler auf der log
Funktion Rückkehr:
Error: TS2322:Type '(...args: any[]) => any' is not assignable to type 'F'.
Auch wenn ich <F extends (...args: any[]) => any>
verwenden erhalte ich den gleichen Fehler. Grundsätzlich weiß ich nicht, wie die zurückgegebene Funktion den generischen Typ F
erfüllt.
Wie kann ich das tun?
Danke, ich dachte nicht über die Verwendung von Funktionsüberladungen wie folgt. – Aaron
Ich habe mit der Idee des anderen Mitwirkenden bearbeitet. Der Typ 'Funktion' ist zu breit. Ihre umbrochene Funktion muss vom Typ sein: '(... args: any []) => any'. – Paleo
Interessant, habe ich versucht 'F erweitert (...args: any []) => any' mit meinem ursprünglichen Code und es erlaubte mir immer noch nicht, mit dieser genauen Signatur aus irgendeinem Grund zurückzukehren, und 'wie F' funktionierte nicht mit' F extends Function'. Ehrlich gesagt verstehe ich nicht, warum das anders ist, aber es funktioniert. – Aaron