Typescript: Är det möjligt att skapa en tupel av angiven längd?


Det borde fungera så här:

type SpecifiedLengthTuple<T, L extends number> = ???

type tupleOfThreeStrings = SpecifiedLengthTuple<string, 3> // [string, string, string]

Om någon undrar, vill jag att detta löser denna fråga: Typescript: öka typ av nummer

med hjälp av TupleUnshift-typen härifrån:

genom att kontrollera ['length'] av en resulterande (inte förskjuten) tuppel.

Svar #1

Du måste definiera den generiska PrependToTuple som tar tuplen [...T] och Item och returnerar [I, ...T]

type PrependTuple<A, T extends Array<any>> = 
  (((a: A, ...b: T) => void) extends (...a: infer I) => void ? I : [])

Du kan använda ett rekursivt anrop som returnerar en tuppel när length är lika med N och returnera den ackumulerade tuppeln med föremålet fört till början om den inte är lika med N

type SpecifiedLengthTuple<T, N extends number, L extends Array<any> = []> = {
  true: L;
  false: SpecifiedLengthTuple<T, N, PrependTuple<T, L>>;
}[L['length'] extends N ? "true" : "false"];

type Result = SpecifiedLengthTuple<boolean, 3>; // [boolean, boolean, boolean]

Lekplats