Can I create a type that takes an argument N extending number and a type T, and returns a tuple with N components, each of type T?
Example:
type A<N extends number, T> = [?];
type E1 = A<2, number>; // [number, number]
type E2 = A<3, boolean>; // [boolean, boolean, boolean]
CodePudding user response:
You could use a recursive conditional type with variadic tuple types to implement this; for example:
type TupleLen<N extends number, T, A extends any[] = []> =
N extends A['length'] ? A : TupleLen<N, T, [T, ...A]>;
type E1 = TupleLen<2, number>; // [number, number]
type E2 = TupleLen<3, boolean>; // [boolean, boolean, boolean]
Of course, the compiler doesn't really allow you to do arbitrary math with numeric literal types and the above type function is therefore fragile. If the N type parameter is specified with something you don't get as a length by recursively prepending to fixed-length tuples, you'll see some unfortunate behavior:
// don't write these unless you like to eat up your CPU
type Oops = TupleLen<-1, number>; // 