【Typescript】type-challenges:medium级别题目(二)

74 阅读2分钟

image.png

7、实现 Last of Array

题目内容

1682503791828.png

题目解析

涉及知识点: infer

这题只要拿到数组的最后一项进行类型推断即可。

当然,前提需要判别是不是数组类型。

题目答案
    // ============= Your Code Here =============
   type Last<T extends any[]> = T extends [...infer Rest, infer Last] ? Last : never

8、实现 Pop

题目内容

1682503950143.png

题目解析

涉及知识点: infer 、 extends

本题其实是基于上一题的。

pop方法 就是每一次删除数组的最后一项,每次返回删除最后一项的数组就可以了。

当然了,如果没有可删除的了,就返回空数组。

题目答案
    // ============= Your Code Here =============
   type Pop<T extends any[]> = T extends [...infer Rest, infer Last] ? [...Rest] : []

9、实现 Promise.all

题目内容

1682505307347.png

题目解析

涉及知识点: keyof 、 extends

Promise.all的形式是什么?

首选,Promise.all是一个函数,传入的参数是一个数组,返回的是一个promise类型。

所以,初始框架就出来啦~

    declare function PromiseAll<T extends any[]>(values: readonly [...T]): Promise<R>

那么我们现在只要搞通R 是什么类型就可以了。

R 肯定返回一个对象 {[K in keyof T]: V}

大家还记得easy难度的await那一道题吗?不记得可以去可查看下~

这里的V的类型推导就和那题很相似了,如果返回结果依然是promise类型就继续遍历下去,不是的话,就直接返回即可。

题目答案
    // ============= Your Code Here =============
    type PromiseFlat<U> = U extends Promise<infer R> ? PromiseFlat<R> : U

    declare function PromiseAll<T extends any[]>(values: readonly [...T]): Promise<{
      [K in keyof T]: PromiseFlat<T[K]>
    }>

10、实现 Type Lookup

题目内容

1682506597654.png

题目解析

涉及知识点: extends

U 的值和类型中的属性type的值相同,所以我们只要判别 T 的 type 值是不是相同即可。

题目答案
    // ============= Your Code Here =============
    type LookUp<T, U> = T extends { type: U } ? T : never

11、实现 Trim Left

题目内容

1682506844686.png

题目解析

涉及知识点: infer

代表空格的值有 " " | "\n" | "\t",所以我们只要判断左边有没有空格就可以了,把所有的左边空格过滤掉,返回剩余的值。

题目答案
    // ============= Your Code Here =============
    type TrimLeft<S extends string> = S extends `${" " | "\n" | "\t"}${infer Rest}` ? TrimLeft<Rest> : S


12、实现 # Trim

题目内容

1682506983686.png

题目解析

涉及知识点: infer

本题就是上一题的改进版~不仅要过滤左边的空格,还要过滤右边的空格,不过操作上也差别不大,做一个结合就可以了。

题目答案
  // ============= Your Code Here =============
type WhiteSpace = " " | "\n" | "\t"

type Trim<S extends string> = S extends `${infer T}${WhiteSpace}` | `${WhiteSpace}${infer T}` ? Trim<T> : S

tips:

Medium级别的题目总共有75题,为了方便少量多次查看,缓解疲劳,我们就以6题为一篇进行。