import { Tuple } from "./global.js"; import { Equal } from "./utils.js"; //#region src/types/array.d.ts /** * 获取数组第一个类型 * @public */ type First = T extends [infer F, ...unknown[]] ? F : never; /** * 获取数组最后一个类型 * @public */ type Last = T extends [...unknown[], infer L] ? L : never; /** * 元组转为键值相等的对象 * @public */ type TupleToObject = { [K in T[number]]: K }; /** * 获取元组长度 * @public */ type Length = T['length']; /** * 获取数组除最后一个元素外的其他元素,如果是空数组则返回空数组 * @public */ type PopArray = ARR extends [] ? [] : ARR extends [...infer Rest, unknown] ? Rest : never; /** * 获取数组除第一个元素外的其他元素,如果是空数组则返回空数组 * @public */ type ShiftArray = ARR extends [] ? [] : ARR extends [unknown, ...infer Rest] ? Rest : never; /** * 合并两个元组类型 * @public */ type Concat, Arr2 extends Tuple> = [...Arr1, ...Arr2]; /** * 判断元组是否包含某个元素 * @public */ type Includes, Item> = Arr extends [infer First, ...infer Rest] ? Equal extends true ? true : Includes : false; /** * 在元组类型尾部添加值 * @public */ type Push, U> = [...T, U]; /** * 在元组类型头部添加值 * @public */ type Unshift, U> = [U, ...T]; /** * zip组合两个元素的元组 * 如果元组不满足含有两个元素,那么返回\{\} * @public */ type Zip2 = One extends [infer OneFirst, infer OneSecond] ? Two extends [infer TwoFirst, infer TwoSecond] ? [[OneFirst, TwoFirst], [OneSecond, TwoSecond]] : [] : []; /** * zip组合任意多个元素的元组 * @public */ type Zip = One extends [infer OneFirst, ...infer OneRest] ? Other extends [infer TwoFirst, ...infer TwoRest] ? [[OneFirst, TwoFirst], ...Zip] : [] : []; /** *反转数组 * @public */ type ReverseArr = Arr extends [infer First, ...infer Rest] ? [...ReverseArr, First] : Arr; /** * 移除数组中的元素 * @public */ type RemoveArrItem = Arr extends [infer First, ...infer Rest] ? Equal extends true ? RemoveArrItem : RemoveArrItem : Result; /** * 创建任意长度相同元素的数组 * @public */ type BuildArray = Arr['length'] extends Length ? Arr : BuildArray; /** * 对数组做分组,传入两个参数,数组和分组的长度 * @public */ type Chunk = Arr extends [infer First, ...infer Rest] ? CurItem['length'] extends ItemLen ? Chunk : Chunk : [...Res, CurItem]; /** * 元组转为嵌套对象 * ['a', 'b', 'c'] 转为 \{ a: \{ b: \{ c: 'xxx' \} \} \} * @public */ type TupleToNestedObject = Tuple extends [infer First, ...infer Rest] ? { [Key in First as Key extends keyof any ? Key : never]: Rest extends unknown[] ? TupleToNestedObject : Value } : Value; //#endregion export { BuildArray, Chunk, Concat, First, Includes, Last, Length, PopArray, Push, RemoveArrItem, ReverseArr, ShiftArray, TupleToNestedObject, TupleToObject, Unshift, Zip, Zip2 };