TypeScript återanvändbara funktionsargument typ
Jag har en funktion som är definierad på följande sätt:
function getRangeBounds(start: number, stop?: number, step?: number) {
if (step === undefined) step = 1;
const actualStart = start !== undefined && stop !== undefined ? start : 0;
const actualStop = stop === undefined ? start : stop;
return [actualStart, actualStop, step];
}
Jag vill att denna funktions argument ska vara typade och återanvändbara. Så jag gjorde:
type Range = Parameters<typeof getRangeBounds>;
Jag vill att typen Range ska kunna återanvändas i ett par fler funktioner, nämligen range och mapRange som kommer att ha följande signaturer respektive:
export function range(...args: Range): ReadonlyArray<number> {
/* this will call getRangeBounds at some point */
}
export function mapRange(...rangeArgs: Range, mapper: MapFunc<number> = IdentityMapper) {
return range(rangeArgs).map(mapper); /* code does not compile */
}
Hur kan jag få dessa funktioner att bete sig på ett sätt så att kontraktet Range respekteras av dem alla och också göra det möjligt att använda extra argument i vissa funktioner som mapRange ovan?
Redigera: Jag fixade kompileringsfelet ovan, så mapRange ser ut så här nu:
export function mapRange(rangeArgs: Range, mapper: MapFunc<number>) {
return range(...rangeArgs).map(mapper);
}
Men jag behöver nu kalla på funktionen på det här sättet:
mapRange([start, stop, step])
Svar #1
Några alternativ för att lägga till extra parametrar till Range för andra funktioner:
function mapRangeRest(mapper: MapFunc<number>, ...rangeArgs: Range) { ... }
mapRangeRest(mapFunc, 1)
mapRangeRest(mapFunc, 1, 2)
function mapRangeCurry(...rangeArgs: Range_): (mapper: MapFunc<number>) { ... }
mapRangeCurry(1)(mapFunc)
mapRangeCurry(1, 2)(mapFunc)
function mapRangeVT<T extends Range_>(...rangeArgs: [...T, MapFunc<number>]) {...}
mapRangeVT(1, mapFunc)
mapRangeVT(1, 2, mapFunc)
Om du kan uppdatera till den senaste TS-versionen passar alternativ 3 förmodligen bäst, eftersom funktionsformen inte ändras.
Spela prov
