一堆ts工具类型

185 阅读1分钟
字符串分割成数组 Str2Arr<'aaa'> = ['a','a']
type Str2Arr<Str extends string, Arr extends Array<string> = []> =
    Str extends `${infer First}${infer Other}` ?
    Str2Arr<Other, [...Arr, First]>
    : Arr
元组转联合类型 Arr2Union<[1,2,string]> = | 1 | 2 | string
type Arr2Union<Arr extends any[], Res = never> =
    Arr extends [infer F, ...infer Reset] ?
    Arr2Union<Reset, Res | F> :
    Res

字符串转联合类型 Str2Union<'abc'> = 'a' | 'b' | 'c'
type Str2Union<Str extends string> = Arr2Union<Str2Arr<Str>>
获取字符串长度 StrLen<'aaa'> = 3
type StrLen<Str extends string> = Str2Arr<Str>['length']

字符串数组转字符串 StrArr2Str<['a','b']> = 'ab'
type StrArr2Str<Arr extends Array<string>, Res extends string = ''> =
    Arr extends [infer F, ...infer O] ?
    StrArr2Str<O, `${Res}${F}`> :
    Res

字符串截取(从头部开始) StrSliceStart<'abc', 2> ='ab'
type StrSliceStart<Str, Len extends number, Arr extends Array<string> = []> =
    Str extends `${infer a}${infer b}` ?
    Arr['length'] extends Len ? StrArr2Str<Arr> : StrSliceStart<b, Len, [...Arr, a]>
    : StrArr2Str<Arr>

数字转字符串 Num2Str<23> = "23"
type Num2Str<T extends object & { toString: () => string }> = `${T}`

是否是负数 IsNegative<-1> = true
type IsNegative<T extends number> = Str2Arr<Num2Str<T>>[0] extends '-' ? true : false

数组求和 ArraySum<[1, 2, 3]> = 6
##### ArraySum辅助类型 生成定长数组`
type GenArr<Len extends number, Base = [], Res = []> = Res['length'] extends Len ? [...Base, ...Res] : GenArr<Len, Base, [...Res, unknown]>

type ArraySum<T extends number[], ResArr = []> = T extends [infer First, ...infer Other] ? ArraySum<Other, GenArr<First, ResArr>> : ResArr['length']

两个正整数相加 Add<1,2> = 3
type Add<N1 extends number, N2 extends number> = ArraySum<[N1, N2]>

从头部某个位置开始获取子串 SubstringFrom<'onclick', 2> = 'click'
type SubstringFrom<Str extends string, StartIdx extends number, ResArr = Str2Arr<Str>, DelArr = []> =
    DelArr['length'] extends StartIdx ? StrArr2Str<ResArr> :
    ResArr extends [infer First, ...infer Other] ? SubstringFrom<Str, StartIdx, Other, [...DelArr, First]> : void

求绝对值 Abs<-22> = "22"
type Abs<T extends number> = IsNegative<T> extends true ? SubstringFrom<Num2Str<T>, 1> : T