ts体操类型通关 (中等 )(上部分)

144 阅读2分钟

练习地址

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] }>

学到的知识点

  1. 克隆一个数组可以这样写 type CloneArr<T extends any[]> = { [k in keyof T]: T[k] }

  2. 泛型推导数组参数产生类似as const作用的写法 values: readonly [...T]

62・Type Lookup

type LookUp<U, T> = U extends {type: T} ? U : never

106・Trim Left

image.png

108・Trim

image.png

110・Capitalize

image.png

知识点

Uppercase 范型工具,可以转换小写为大写

116・Replace

image.png

119・ReplaceAll

image.png

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

image.png

531・String to Union

image.png

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 

image.png

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

{} 的判定方法:

  1. Record<string, never>
  2. 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的方法

  1. type IsStr<T> = T extends string ? string extends T ? false : true : false
  2. type IsStr = T extends `${infer S}` ? true : false