UNPKG

type-plus

Version:
28 lines 1.39 kB
import type { DigitArray } from '../math/numeric_struct.js'; import type { IsInteger } from '../numeric/integer.js'; import type { IsPositive } from '../numeric/positive.js'; /** * Creates `Tuple<T>` with `L` number of elements. * @note Other cool implementations by @lazytype, @jcalz: * @see https://github.com/microsoft/TypeScript/issues/26223#issuecomment-674514787 * @see https://github.com/microsoft/TypeScript/issues/47874#issuecomment-1039157322 */ export type CreateTuple<L extends number, T = unknown, Fail = never> = number extends L ? T[] : IsPositive<L> extends true ? IsInteger<L> extends true ? ToTuple<[], DigitArray.FromString<`${L}`>, T> : Fail : Fail; export type ToTuple<R extends any[], S extends number[], X = any> = S['length'] extends 0 ? R : S['length'] extends 1 ? [...R, ...DigitToTuple<X>[S[0]]] : S extends [any, ...infer T] ? T extends any[] ? ToTuple<Multi10<[...R, ...DigitToTuple<X>[S[0]]]>, T> : never : never; type DigitToTuple<T = 1> = { [k in number]: any[]; } & { 0: []; 1: [T]; 2: [T, T]; 3: [T, T, T]; 4: [T, T, T, T]; 5: [T, T, T, T, T]; 6: [T, T, T, T, T, T]; 7: [T, T, T, T, T, T, T]; 8: [T, T, T, T, T, T, T, T]; 9: [T, T, T, T, T, T, T, T, T]; }; type Multi10<C extends any[]> = [...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C]; export {}; //# sourceMappingURL=create_tuple.d.ts.map