typescript - Skicka en funktion som accepterar färre parametrar - hur man tvingar samma antal parametrar för en funktion som skickas
I TypeScript kan jag tilldela en funktion som har färre parametrar till en variabel av en funktionstyp som har fler variabler (men inte tvärtom, se Jämföra två funktioner). Så används JS i praktiken, t.ex.
Array.map accepterar en callback av: (t: T, idx: number, arr: T[]) -> U
men vi skickar ofta en funktion som kräver färre parametrar: [1,2,3,4,5].map(e => e * 2)
Vad händer om jag vill kräva att endast funktioner med exakt samma antal parametrar accepteras (annars TSC-fel)? Eftersom detta rör TypeScript, bör det vara ett kompileringsfel, inte ett körfel.
Exempel :
En enkel räknare som accepterar funktioner på detta sätt:
type ArithmeticFn = (a: number, b: number) => number;
Jag skapar några funktioner som uppfyller kraven
const add: ArithmeticFn = (a, b) => a + b;
const sub: ArithmeticFn = (a, b) => a - b;
const mul: ArithmeticFn = (a, b) => a * b;
och en som inte gör det:
const sth: ArithmeticFn = (a) => a ** 2;
Nedan objekt kommer att acceptera funktioner som har 2 eller färre parametrar:
const Calculator = {
perform(oper: ArithmeticFn, op1, op2) {
return oper(op1, op2);
}
}
Således bryter följande funktion min logik:
Calculator.perform((a) => a**2, 1, 2)
Med andra ord, finns det något annat sätt att tvinga detta (så att ovanstående exempel ger ett fel)? Jag skulle kunna hacka det genom att ersätta positionsbaserade fn-parametrar med en optionspåse ({a: number, b: number}), men detta blir för smutsigt och bryter mot det funktionella tillvägagångssättet.
Svar #1
Att använda function.length borde kunna lösa ditt problem.