/** * Array and tuple utility types for TypeScript * @module ArrayTypes */ /** * Extracts the element type of an array * @template T - The array type * @example * ```typescript * type StringArray = string[]; * type ElementType = ArrayElement; // string * * type NumberArray = Array; * type NumberElement = ArrayElement; // number * ``` */ export type ArrayElement = T extends readonly (infer U)[] ? U : never; /** * Creates a tuple type with a specific length and element type * @template T - The element type * @template L - The length * @example * ```typescript * type StringTuple3 = Tuple; // [string, string, string] * type NumberTuple5 = Tuple; // [number, number, number, number, number] * ``` */ export type Tuple = L extends L ? number extends L ? T[] : _TupleOf : never; type _TupleOf = R['length'] extends L ? R : _TupleOf; /** * Creates a tuple type with optional elements * @template T - The element type * @template L - The length * @example * ```typescript * type OptionalStringTuple = OptionalTuple; // [string?, string?, string?] * ``` */ export type OptionalTuple = Tuple; /** * Creates a tuple type with the first element required and rest optional * @template T - The element type * @template L - The length * @example * ```typescript * type HeadRequiredTuple = HeadRequiredTuple; // [string, string?, string?] * ``` */ export type HeadRequiredTuple = [T, ...Tuple]; /** * Extracts the first element type of a tuple * @template T - The tuple type * @example * ```typescript * type MyTuple = [string, number, boolean]; * type First = FirstElement; // string * ``` */ export type FirstElement = T[0]; /** * Extracts the last element type of a tuple * @template T - The tuple type * @example * ```typescript * type MyTuple = [string, number, boolean]; * type Last = LastElement; // boolean * ``` */ export type LastElement = T extends [...any[], infer L] ? L : never; /** * Extracts all element types except the first * @template T - The tuple type * @example * ```typescript * type MyTuple = [string, number, boolean]; * type Rest = RestElements; // [number, boolean] * ``` */ export type RestElements = T extends [any, ...infer R] ? R : never; /** * Extracts all element types except the last * @template T - The tuple type * @example * ```typescript * type MyTuple = [string, number, boolean]; * type Init = InitElements; // [string, number] * ``` */ export type InitElements = T extends [...infer I, any] ? I : never; /** * Creates a tuple type by prepending an element * @template T - The element to prepend * @template U - The existing tuple * @example * ```typescript * type Original = [number, boolean]; * type Prefixed = Prepend; // [string, number, boolean] * ``` */ export type Prepend = [T, ...U]; /** * Creates a tuple type by appending an element * @template T - The existing tuple * @template U - The element to append * @example * ```typescript * type Original = [string, number]; * type Appended = Append; // [string, number, boolean] * ``` */ export type Append = [...T, U]; /** * Creates a tuple type by inserting an element at a specific position * @template T - The existing tuple * @template U - The element to insert * @template I - The insertion index * @example * ```typescript * type Original = [string, boolean]; * type Inserted = Insert; // [string, number, boolean] * ``` */ export type Insert = T extends [...infer A, ...infer B] ? A['length'] extends I ? [...A, U, ...B] : never : never; /** * Creates a tuple type by removing an element at a specific position * @template T - The existing tuple * @template I - The index to remove * @example * ```typescript * type Original = [string, number, boolean]; * type Removed = Remove; // [string, boolean] * ``` */ export type Remove = T extends [...infer A, any, ...infer B] ? A['length'] extends I ? [...A, ...B] : never : never; /** * Creates a tuple type by replacing an element at a specific position * @template T - The existing tuple * @template U - The new element * @template I - The replacement index * @example * ```typescript * type Original = [string, number, boolean]; * type Replaced = Replace; // [string, string, boolean] * ``` */ export type Replace = T extends [...infer A, any, ...infer B] ? A['length'] extends I ? [...A, U, ...B] : never : never; /** * Creates a tuple type with elements in reverse order * @template T - The tuple type * @example * ```typescript * type Original = [string, number, boolean]; * type Reversed = Reverse; // [boolean, number, string] * ``` */ export type Reverse = T extends [infer F, ...infer R] ? [...Reverse, F] : []; /** * Creates a tuple type by concatenating two tuples * @template T - The first tuple * @template U - The second tuple * @example * ```typescript * type First = [string, number]; * type Second = [boolean, Date]; * type Concatenated = Concat; // [string, number, boolean, Date] * ``` */ export type Concat = [...T, ...U]; /** * Creates a tuple type with a specific range of elements * @template T - The tuple type * @template Start - The start index (inclusive) * @template End - The end index (exclusive) * @example * ```typescript * type Original = [string, number, boolean, Date, symbol]; * type Sliced = Slice; // [number, boolean, Date] * ``` */ export type Slice = T extends [...infer A, ...infer B] ? A['length'] extends Start ? B extends [...infer C, ...infer D] ? C['length'] extends End ? C : never : never : never : never; export {}; //# sourceMappingURL=array.d.ts.map