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

Relaterade artiklar