2・获取函数返回类型
type MyReturnType<T> = T extends (...args: any) => infer R ? R : never
3・实现 Omit
type MyOmit<T, K extends keyof T> = { [p in keyof T as p extends K ? never : p]: T[p] }
type MyOmit<T, K extends keyof T> = { [p in Exclude<keyof T, K>]: T[p] }
8・Readonly 2
type MyReadonly2<T, K extends keyof T = keyof T> = { readonly [p in K]: T[p] } & { [p in Exclude<keyof T, K>]: T[p] }
9・深度 Readonly
type DeepReadonly<T> = { readonly [k in keyof T]: T[k] extends object ? T[k] extends Function ? T[k] : DeepReadonly<T[k]> : T[k] }
10・元组转合集
type TupleToUnion<T extends any[]> = T[number]
12・可串联构造器
type Chainable<R = {}> = { option<T extends string, V>(key: T, value: V): Chainable<{[k in T]: V} & R> get(): R }
15・最后一个元素
type Last<T extends any[]> = T extends [...infer O, infer L] ? L : never
16・出堆
type Pop<T extends any[]> = T extends [...infer O, infer L] ? O : T
20・Promise.all
declare function PromiseAll<T extends any[]>(values: readonly [...T]): Promise<{ [K in keyof T]: T[K] extends Promise<infer R> ? R : T[K] }>
学到的知识点
-
克隆一个数组可以这样写
type CloneArr<T extends any[]> = { [k in keyof T]: T[k] } -
泛型推导数组参数产生类似as const作用的写法
values: readonly [...T]
62・Type Lookup
type LookUp<U, T> = U extends {type: T} ? U : never
106・Trim Left
108・Trim
110・Capitalize
知识点
Uppercase 范型工具,可以转换小写为大写
116・Replace
119・ReplaceAll
191・追加参数
type AppendArgument<Fn, A> = Fn extends (...args: infer P) => infer R ? (...argsss: [...P, A]) => R : Fn
296・Permutation
type Permutation<T, D = T> = [T] extends [never] ? [] : T extends D ? [T, ...Permutation<Exclude<D, T>>] : []
知识点
never extends never ? true : false 是true,但是如果作为范型过来的就不成立
type Test<T> = T extends never ? true : false,如果我这样使用 Test<never>会直接返回never。要写成 type IsNever<T> = [T] extends [never] ? true : false
298・Length of String
type LengthOfString<S extends string, R extends any[] = []> = S extends `${infer F}${infer L}` ? LengthOfString<L, [...R, F]> : R['length']
459・Flatten
啰嗦版本
type Flatten<T, R extends any[] = []> = T extends any[] ? T extends [infer F, ...infer E] ? [...R, ...Flatten<F>, ...Flatten<E>] : T : [T]
干净版本
type Flatten<T extends any[]> = T extends [infer First, ...infer Rest] ? First extends any[] ? Flatten<[...First, ...Rest]> : [First, ...Flatten<Rest>] : []
527・Append to object
type AppendToObject<T, U extends string, V> = { [k in keyof T | U]: k extends U ? V : T[Exclude<k, U>] }
529・Absolute
531・String to Union
599・Merge
type Merge<F, S> = { [k in keyof F | keyof S]: k extends keyof S ? S[k] : F[Extract<k, keyof F>] }
612・KebabCase
645・Diff
type Diff<O, O1> = { [k in Exclude<keyof O, keyof O1> | Exclude<keyof O1, keyof O>]: k extends keyof O ? O[k] : O1[Extract<keyof O1, k>] }
949・AnyOf
type Falsy = 0 | '' | [] | false | Record<string, never>
type AnyOf<T extends readonly any[]> = T extends [infer L, ...infer R] ? L extends Falsy ? AnyOf<R> : true : false
{} 的判定方法:
Record<string, never>type IsEmptyObj<T> = T extends Object ? keyof T extends never ? true : false : false
1042・IsNever
type IsNever<T> = [T] extends [never] ? true : false
1097・IsUnion
Amazing
type IsUnion<T, U = T> = T extends U ? [U] extends [T]? false : true :never
1130・ReplaceKeys
type ReplaceKeys<U, T extends string, Y extends Record<string, any>> = U extends object ? { [k in keyof U]: k extends T ? k extends keyof Y ? Y[k] : never : U[k] } : never
1367・Remove Index Signature
type IsStr<T> = T extends string ? string extends T ? false : true : false
type RemoveIndexSignature<T extends object> = { [k in keyof T as IsStr<k> extends true ? k : never]: T[k] }
知识点,判断类型是具体的字符而不是string的方法
type IsStr<T> = T extends string ? string extends T ? false : true : false- type IsStr = T extends `${infer S}` ? true : false