type GetFirst = Arr extends [infer First, ...unknown[]] ? First : never;
type GetLast = Arr extends [...unknown[],infer Last] ? Last : never;
type PopArr = Arr extends [] ? [] : Arr extends [...infer Result,unknown] ? Result : never;
type ShiftArr = Arr extends [] ? [] : Arr extends [unknown,...infer Result] ? Result : never;
type StartWith = Str extends `${Start}${string}` ? true : false;
type ReplaceStr = Str extends `${infer Prefix}${From}${infer Suffix}` ?ReplaceStr<`${Prefix}${To}${Suffix}`,From,To> : Str
type TrimStringRight = Str extends `${infer Result}${' '}` ? TrimStringRight : Str;
type TrimStringLeft = Str extends `${' '}${infer Result}` ? TrimStringLeft : Str;
type TrimString = Str extends `${' '}${infer Result}${' '}` ? TrimString : Str;
type FunctionArgs = Fn extends (...args:infer Args) => unknown ? Args : never;
type FunctionResult = Fn extends (...args:any[]) => infer Result ? Result : never;
type FunctionThis = Fn extends (this:infer This,...args:unknown[])=>unknown ? This : never;
type GetInstanceTypeany> = Type extends new(...args:any) => infer Result ? Result : never;
// 测试案例
interface Person{name: string
}
interface PersonConstructor{new(name:string):Person
}
type person = GetInstanceType;
type GetInstanceParamany> = Type extends new(...args:infer Result) => unknown ? Result : never;
// 测试案例
interface Person{name: string
}
interface PersonConstructor{new(name:void):Person
}
type person = GetInstanceParam;
type Push = [...Arr,Ele];
type Shift = [Ele,...Arr];
type Concat =
One extends [infer OneFirst, infer OneSecond] ?Two extends [infer TwoFirst, infer TwoSecond] ? [[OneFirst,OneSecond],[TwoFirst,TwoSecond]] : []
: []
type Concat =
One extends [infer OneFirst,...infer OneOther] ?Two extends [infer TwoFirst,...infer TwoOther] ? [[OneFirst,TwoFirst],...Concat] : []
: [];
type StringFistToUp = Str extends `${infer First}${infer Other}` ? `${Uppercase}${Other}` : never
type DeleteString =
Str extends `${infer Start}${Ele}${infer End}` ? DeleteString<`${Start}${End}`,Ele> : Str
type FunAddParam =
Fn extends (...args:infer Args)=>infer Result ? (...args:[...Args,Arg])=>Result : never
type KeyUp = {[Key in keyof Obj as Uppercase]:Obj[Key];
}
type _Record = {[P in K]: T
}
type ReadonlyParam = {readonly [P in keyof T]: T[P]
}
type toSelector = {[P in keyof T]?: T[P]
}
type RemoveReadonly = {-readonly [P in keyof T]: T[P]
}
type ClearSelector = {[P in keyof T]-?: T[P]
}
type FilterValue,valueType extends unknown> = {[Key in keyof T as T[Key] extends valueType ? Key : never]: T[Key]
}
type PromiseValue =
T extends Promise?PromiseValue
: T
type promise = PromiseValue>>>
type ReverseArr> = T extends [infer First,...infer Other] ? [...ReverseArr,First] : T;
type IsEqual = (A extends B ? true : false) & (B extends A ? true : false);
type Include =
Arr extends [infer First,...infer Other] ?IsEqual extends true ? true : Include
: false;
type RemoveArrItem = Arr extends [infer First,...infer Other] ?IsEqual- extends true ? RemoveArrItem
: RemoveArrItem
: Result
type IsEqual = (A extends B ? true : false) & (B extends A ? true : false)
type BuildArr = Arr['length'] extends Length ? Arr : BuildArr
type Replace = Str extends `${infer Start}${From}${infer End}` ? Replace<`${Start}${To}${End}`,From,To> : Str
type StrType = Str extends `${infer First}${infer Other}` ? StrType : Result
type ReverseString = Str extends `${infer First}${infer Other}` ? ReverseStringResult}${First}`> : Result
-递归将所有层的索引都变成只读
错误代码,如果测试一下我们就会发现,递归没有进行下去。因为ts的类型只有被用到的时候才会被计算。这里只是给第一次的索引加上了只读,但是没有使用。所以不会进行计算,我们可以加一个Obj extends any让其计算。
type DeepReadonly> = Obj extends any ? {readonly [Key in keyof Obj]: Obj[Key] extends Record ? Obj[Key] extends Function ? Obj[Key] : DeepReadonly: Obj[Key]
} : never
type BuildArray = Result['length'] extends Length ? Result : BuildArray
type Add = Arr extends [infer Start extends number,...infer Other]? Add,...Result]> : Result['length']
type s = Add<[1,2,3]>
type BuildArray = Result['length'] extends Length ? Result : BuildArray
type SubTract = BuildArray extends [...BuildArray,...infer Result] ? Result['length'] : never
type BuildArray = Result['length'] extends Length ? Result : BuildArray
type SubTract = BuildArray extends [...BuildArray,...infer Result] ? Result['length'] : nevertype Multiply = Num1 extends 0 ? Result['length'] : Multiply,Num2,[...Result,...BuildArray]>
type BuildArray = Arr['length'] extends Length ?Arr :BuildArray
type Subtract = BuildArray extends [...arr1: BuildArray, ...arr2: infer Rest] ?
Rest['length'] : nevertype Divide = Num1 extends 0 ?ResultArr['length'] :Divide,Num2,[unknown, ...ResultArr]>;
type divide = Divide<6,3>;
type StrLen = Str extends `${string}${infer Rest}`? StrLen
: ResultArr['length'];
type str = StrLen<'123'>;
type Than = Num1 extends Num2 ? false :Count['length'] extends Num2 ? true :Count['length'] extends Num1 ? false :Than
type Fi = Idx['length'] extends Num ? Right['length'] : Fitype Fib = Fi<[],[1],Num,[1]>
type Tool = Str extends `${infer First}_${infer Start}${infer End}` ? Tool<`${First}${Uppercase}${End}`> : Str
type item = Tool<'aa_bb_cc_dd'>;
type Tool =
A extends A?[B] extends [A] ? false : true
: never
type bemResult = BEM<'guang', ['aaa', 'bbb'], ['warning', 'success']>;
//会转换成
guang__aaa--warning guang__bbb--success
type BEM = `${Ele1}__${Ele2[number]}--${Ele3[number]}`
type Combination =| A| B| `${A}${B}`| `${B}${A}`;
type AllCombinations =
A extends A? Combination>>: never;
type all = AllCombinations<'A' | 'B' | 'C'>;
type IsEqual = (()=>T extends A ? 1 : 2) extends (()=>T extends B ? 1 : 2) ? true : false
type Test = T extends number ? 1 : 2;
type res = Test<1 | 'a'>;//type res = 1 | 2
type Test = T extends true ? 1 : 2;
type res = Test;//type res = false | true
type Test = T extends true ? 1 : 2;
type res = Test;//type res = 1 | 2
type Test = T extends true ? 1 : 2;
type res = Test;//type res = never
type Parameters any> = T extends (...args: infer P) => any ? P : any;
type ReturnType any> = T extends (...args: any) => infer R ? R : any;
type ConstructorParameters any> = T extends abstract new (...args: infer P) => any ? P : never;
type InstanceType any> = T extends abstract new (...args: any) => infer R ? R : any;
type Partial = {[P in keyof T]?: T[P];
};
type Required = {[P in keyof T]-?: T[P];
};
type Readonly = {readonly [P in keyof T]: T[P];
};
type Pick = {[P in K]: T[P];
};
type Record = {[P in K]: T;
};
type Exclude = T extends U ? never : T;
type Extract = T extends U ? T : never;
type Omit = Pick>;
type Awaited =T extends null | undefined? T : T extends object & { then(onfulfilled: infer F): any }? F extends ((value: infer V, ...args: any) => any)? Awaited: never : T;
type NonNullable = T extends null | undefined ? never : T;
type ThisParameterType = T extends (this: infer U, ...args: any[]) => any ? U : unknown;
type OmitThisParameter = unknown extends ThisParameterType ? T : T extends (...args: infer A) => infer R ? (...args: A) => R : T;