Easy题(13/13)

Easy 题共13道,是真的都很easy

题单

解答

4・实现 Pick

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

通过 keyof 取出 T 类型的所有键,如果只是 MyPick<T, K>的话,会报错如下

Type 'K' is not assignable to type 'string | number | symbol'.
Type 'key' cannot be used to index type 'T'.

7・实现 Readonly

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

https://tsch.js.org/11/play/zh-CN

11・元组转换为对象

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

14・第一个元素

type First<T extends any[]> = T extends [infer F, ...any[]] ? F : never

符合小册中模式匹配做提取套路,通过 extends 对类型参数做匹配,结果保存到通过 infer 声明的局部类型变量里,若匹配就能从该局部变量里拿到提取出的类型。

18・获取元组长度

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

会抛出 Error 说明得限制传入的类型

43・Exclude

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

这题可能看的人一头雾水,但是可以看看这里:Distributive Conditional Types

type ToArray<Type> = Type extends any ? Type[] : never
// 如果我们将联合类型插入 ToArray,则条件类型将应用于该联合的每个成员。
type StrArrOrNumArr = ToArray<string | number>
//   ^type StrArrOrNumArr = string[] | number[]

也就是分别判断 T 中的每个联合类型,是否 extends U

189・Awaited

type MyAwaited<T extends PromiseLike<any>> = T extends PromiseLike<infer V>
  ? V extends PromiseLike<any>
    ? MyAwaited<V>
    : V
  : never

这里用到了 PromiseLike 这个类型

268・If

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

这题也比较基础,考的就是 extends

533・Concat

在类型系统里实现 JavaScript 内置的 Array.concat 方法,这个类型接受两个参数,返回的新数组类型应该按照输入参数从左到右的顺序合并为一个新的数组。

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

898・Includes

在类型系统里实现 JavaScript 的 Array.includes 方法,这个类型接受两个参数(左边参数是否 include 右边参数),返回的类型要么是 true 要么是 false

type IsEqual<A, B> = (A extends B ? true : false) & (B extends A ? true : false)
type Includes<T extends readonly any[], U> = T extends [infer F, ...infer Rest]
  ? IsEqual<F, U> extends true
    ? true
    : Includes<Rest, U>
  : false

运用了小册中的套路三:递归复用做循环,

3057・Push

type Push<T, U> = T extends [...infer Rest] ? [...Rest, U] : never

3060・Unshift

type Unshift<T, U> = T extends [...infer Rest] ? [U, ...Rest] : never

3312・Parameters

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

最后更新于