/** 提取Promise返回值 */ type UnboxPromise> = T extends Promise ? U : never; /** 将联合类型转为交叉类型 */ declare type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ( k: infer I, ) => void ? I : never; /** eg: type result = StringToUnion<'abc'> 结果:'a'|'b'|'c'*/ type StringToUnion = S extends `${infer S1}${infer S2}` ? S1 | StringToUnion : never; /** 字符串替换,类似js的字符串replace方法 */ type Replace< Str extends string, From extends string, To extends string, > = Str extends `${infer Left}${From}${infer Right}` ? `${Left}${To}${Right}` : Str; /** 字符串替换,类似js的字符串replaceAll方法 */ type ReplaceAll< Str extends string, From extends string, To extends string, > = Str extends `${infer Left}${From}${infer Right}` ? Replace, From, To> : Str; /** eg: type result = CamelCase<'foo-bar-baz'>, 结果:fooBarBaz */ type CamelCase = S extends `${infer S1}-${infer S2}` ? S2 extends Capitalize ? `${S1}-${CamelCase}` : `${S1}${CamelCase>}` : S; /** eg: type result = StringToArray<'abc'>, 结果:['a', 'b', 'c'] */ type StringToArray = S extends `${infer S1}${infer S2}` ? StringToArray : T; /** `RequiredKeys`是用来获取所有必填字段,其中这些必填字段组合成一个联合类型 */ type RequiredKeys = { [P in keyof T]: T extends Record ? P : never; }[keyof T]; /** `OptionalKeys`是用来获取所有可选字段,其中这些可选字段组合成一个联合类型 */ type OptionalKeys = { [P in keyof T]: {} extends Pick ? P : never; }[keyof T]; /** `GetRequired`是用来获取一个类型中,所有必填键及其类型所组成的一个新类型的 */ type GetRequired = { [P in RequiredKeys]-?: T[P]; }; /** `GetOptional`是用来获取一个类型中,所有可选键及其类型所组成的一个新类型的 */ type GetOptional = { [P in OptionalKeys]?: T[P]; }; /** type result1 = Includes<[1, 2, 3, 4], '4'> 结果: false; type result2 = Includes<[1, 2, 3, 4], 4> 结果: true */ type Includes = K extends T[number] ? true : false; /** eg:type result = MyConcat<[1, 2], [3, 4]> 结果:[1, 2, 3, 4]*/ type MyConcat = [...T, ...U]; /** eg: type result1 = MyPush<[1, 2, 3], 4> 结果:[1, 2, 3, 4] */ type MyPush = [...T, K]; /** eg: type result3 = MyPop<[1, 2, 3]> 结果:[1, 2] */ type MyPop = T extends [...infer L, infer R] ? L : never; // eslint-disable-line