完成🔥

13 Hello World

  1. type HelloWorld = string;

4 Pick

type MyPick<T extends Record<any, any>, K extends keyof T> = { [key in K]: T[key]}

需要考虑对 TK做一些限制。

7 Readonly

type MyReadonly<T> = { readonly [k in keyof T]: T[k]}

type MyReadonly<T> = { +readonly [k in keyof T]: T[k]}
  • + 号的用法

image.png

11 Tuple to Object

type TupleToObject<T extends readonly any[]> = { [K in T[number]]: K }

14 First of Array

type First<T extends any[]> = T['length'] extends 0 ? never: T[0];

一开始以为 T[0]就完事了,但是还要考虑到数组为空的情况,数组为空的类型为 never[]此时就应该是 never。

18 Length of Tuple

type Length<T extends readonly unknown[]> = T['length']

43 Exclude

type MyExclude<T, U> = T extends U ? never : T;

189 Awaited

type MyAwaited<T extends Promise<any>> = T extends Promise<infer U> ? (U extends Promise<any> ? MyAwaited<U> : U) : T

用到递归

268 If

type If<C extends boolean, T, F> = C extends true ? T : F;

533 Concat

type Concat<T extends readonly unknown[], U extends unknown[]> = [...T, ...U];

898 Includes

type Includes<T extends readonly any[], U> = T extends [infer R1, ...(infer R2)] 
  ? (Equal<R1, U>) extends true ? true : Includes<R2, U>
  : false;

这题怎么也应该算个 medium 吧

  • Equal

3057 Push

type Push<T extends readonly unknown[], U> = [...T, U];

3060 Unshift

和 3057 差不多

type Unshift<T extends readonly unknown[], U> = [U, ...T];

3312 Parameters

type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer R) => any ? R : never;

infer 登场。