Readonly (只读)
type Readonly<T> = {
readonly [k in keyof T]:T[K]
}
type Person = {
name:string
age: number
}
type X = Readonly<Person>
const x: X = { name: 'John', age: 42 };
x.name = 'vino'
Mutable (可变的)
type Person = { name: string, age: number };
type Mutable<T> = {
-readonly [P in keyof T]: T[P];
}
type X = Mutable<Readonly<Person>>
Partial (部分)
type Partial<T> = {
[K in keyof T]?: T[K];
}
Required (必须)
type Person = {
name?:string
age?: number
}
type Required<T> = {
[K in keyof T]-?:T[K]
}
type X = Required<Person>
Exclude (排除)
type Exclude<T,K> = T extends K ? never : T
type X = Exclude< 1 | 2 | 3, 3>
Extract (提取)
type Extract<T, K> = T extends K ? T : never;
type X = Exclude< 1 | 2 | 3, 3 | 4>
Pick (选择)
type Person = {
name:string
age: number
}
type Pick<T,K extends keyof T> = {
[P in K]: T[P]
}
type X = Pick<Person,'name'>
Omit (省去)
type Person = {
name:string
age: number
}
type Omit<T, K> = {
[P in Exclude<keyof T, K>]: T[P];
}
type X = Omit<Person,'name'>
type Omit<T,K extends keyof any> = Pick<T,Exclude<keyof T, K>>
TupleToObjec
const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const
type TupleToObject<T extends readonly any[]> ={
[K in T[number]] : K
}
type result = TupleToObject<typeof tuple>
FirstOfArray
type arr1 = ['a', 'b', 'c']
type arr2 = [3, 2, 1]
type First<T extends any[]> = T extends [infer P, ...any[]] ? P : never
type head1 = First<arr1>
type head2 = First<arr2>
# LengthOfTuple
type tesla = ['tesla', 'model 3', 'model X', 'model Y']
type spaceX = ['FALCON 9', 'FALCON HEAVY', 'DRAGON', 'STARSHIP', 'HUMAN SPACEFLIGHT']
type teslaLength = Length<tesla>
type spaceXLength = Length<spaceX>
Awaited
type MyAwaited<T> = T extends Promise<infer P> ? (P extends Promise<any> ? MyAwaited<P> : P) : never
type ExampleType = Promise<string>
type Result = MyAwaited<ExampleType>
If
type If<C, T, F> = C extends true ? T : F
type A = If<true, 'a', 'b'>
type B = If<false, 'a', 'b'>
Concat
type Concat<T extends any[],K extends any[]> = [...T,...K]
type Result = Concat<[1], [2]>
Push
type Push<T extends any[], U> = [...T,U]
type Result = Push<[1, 2], '3'>
Parameters
const foo = (arg1: string, arg2: number): void => {}
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer R) => any ? [...R] : []
type FunctionParamsType = MyParameters<typeof foo>