extends
let a1:A1 = '1';
type A2 = 'y' extends 'x' ? string : number;
let a2:A2 = 2;
type A4 = 'x' | 'y' extends 'y' ? number : string;
let a4:A4 = '4';
type A5<T> = T extends 'y' ? number : string;
type A6 = A5<'x'|'y'>;
infer
type GetLastType<T extends Array<any> = []> = T extends [infer F,...infer M,infer L] ? L : never;
type arr1 = [false,'',undefined,300];
type last = GetLastType<arr1>;
type Includes1<
S1 extends string,
S2 extends string
> = S1 extends `${infer Left}${S2}${infer Right}` ? Left : false;
type Result = Includes1<"1", "400">
keyof
type Person2 = [undefined,null,1,'300'];
type P2 = keyof Person2;
let b:P2 = '1';
type Person = {
name:string,
age:number,
sex:boolean,
}
type P1 = keyof Person;
let a:P1 = 'age';
自定义方法
type MyType<T extends number,K extends number,A extends any[] = []> =
T extends A['length'] ? false :
K extends A['length'] ? true :
MyType<T,K,[...A,1]>
let a:MyType<2,1> = true;
let b:MyType<3,6> = false;
type FlattenList<T extends any[]> = T extends [infer First, ...infer Last]
? First extends any[]
? [...FlattenList<First>,...FlattenList<Last>]
: [First, ...FlattenList<Last>]
: [];
type arr = [[1, 2], [[3, 5, [4]]]];
type Lr = FlattenList<arr>;
type OtoA = {
name:string,
age:number,
sex:boolean
}
type ObjectToArray<T,K = keyof T> = K extends keyof T ? [K,T[K]] : never;
type OTA = ObjectToArray<OtoA>;
type GetTotal<T extends any[]> = {
[K in keyof T] : T[K] extends () => infer R ? R : T[K]
}
type Tup = [1,()=>number,string];
type Total = GetTotal<Tup>
interface Ob{
a:3,
b:false,
c:()=>30,
d:()=>'FrontEnd'
}
type getFunc<T,TargetType> = {
[K in keyof T] : T[K] extends TargetType ? K : never;
}[keyof T];
type Fun = getFunc<Ob,Function>;
实现部分数组方法
type Push<A, T> = A extends Array<any> ? [...A, T] : never;
type Pop<T> = T extends [...infer rest, infer P] ? [...rest] : never;
type Unshift<A, T> = A extends Array<any> ? [T, ...A] : never;
type Shift<T> = T extends [infer P, ...infer rest] ? [...rest] : never;
type Includes<T, U> = T extends [infer P, ...infer rest]
? U extends P
? true
: Includes<rest, U>
: false;
type Concat<T extends Array<any>, K extends Array<any>> = [...T, ...K];
type Ftype = string | number | bigint | boolean | null | undefined;
type Join<T, Z extends Ftype = ","> = T extends [infer F, ...infer rest]
? F extends false
? ""
: F extends Ftype
? rest extends []
? `${F}`
: `${F}${Z extends "," ? "" : " "}${Z}${Z extends "," ? "" : " "}${Join<
rest,
Z
>}`
: ""
: "";
type FlatArr<T extends any[]> = T extends [infer F, ...infer rest]
? F extends Array<any>
? [...FlatArr<F>, ...FlatArr<rest>]
: [F, ...FlatArr<rest>]
: [];
type Fill<T extends any[], C,N extends any[] = []> = N['length'] extends T['length'] ? N : Fill<T,C,[...N,C]>
type ToString<T> = Join<T>;
type Reverse<T,R extends any[] = []> = T extends [infer F,...infer rest] ? Reverse<rest,[F,...R]> : R ;
type IndexOf<T,K,C extends any[] = []> = Includes<T,K> extends false ? -1 : (
T extends [infer F,...infer rest] ? (
F extends K ? C['length'] : IndexOf<rest,K,[...C,any]>
) : C['length']
)
type tuple = [1, 2, 3];
type tuple2 = [4, 5, 6];
type push = Push<tuple, 4>;
type pop = Pop<tuple>;
type unshift = Unshift<tuple, 10>;
type shift = Shift<tuple>;
type includes = Includes<tuple, 3>;
type concat = Concat<tuple, tuple2>;
type join = Join<tuple>;
type flat = FlatArr<[[1], [2, 3, [5]], [[123, 900, [40]]]]>;
type tostring = ToString<tuple>
type fill = Fill<tuple, 'LF'>;
type reverse = Reverse<tuple>;
type indexof = IndexOf<tuple,3>;
实现部分内置类型
type ExcludeCopy<T,U> = T extends U ? never : T;
type exclude = ExcludeCopy<'x'|'y','y'>;
type ExtractCopy<T,U> = T extends U ? T : never;
type extract = ExtractCopy<'a'|'b'|'c','b'|'c'>;
type RequiredCopy<T> = {
[K in keyof T]-? : T[K]
}
type TestType2 = RequiredCopy<{a?:string}>;
type PartialCopy<T> = {
[K in keyof T]? : T[K]
}
type ReadonlyCopy<T> = {
readonly [K in keyof T] : T[K]
}
type Information = {
name:string,
age:number,
sex:boolean
}
type PickCopy<T,K extends keyof T> = {
[U in K]:T[U]
}
type PickTest = PickCopy<Information,'name'|'age'>;
type OmitCopy<T,U extends keyof any> = PickCopy<T,ExcludeCopy<keyof T,U>>
type TestOmit = OmitCopy<Information,'age'>;
type RecordCopy<T extends string | number | symbol,P> = {
[K in T] : P
}
type TestRecord = RecordCopy<string,Information>;
type ReturnTypeCopy<T> = T extends (...params)=> infer P ? P : never;
type GetParameterCopy<T extends (...args:any)=>any > = T extends (...args:infer P)=> any ? P : never;
const ReturnFunc = (p:string,a:boolean) => {
return 3000;
}
type TF = typeof ReturnFunc;
type TestReturnType = ReturnTypeCopy<typeof ReturnFunc>
type TestGetParameter = GetParameterCopy<typeof ReturnFunc>
type NonNollable<T> = T extends null | undefined ? never : T;
type TestNonNollable = NonNollable<string | undefined | number | null >;