7、实现 Last of Array
题目内容
题目解析
涉及知识点: infer
这题只要拿到数组的最后一项进行类型推断即可。
当然,前提需要判别是不是数组类型。
题目答案
// ============= Your Code Here =============
type Last<T extends any[]> = T extends [...infer Rest, infer Last] ? Last : never
8、实现 Pop
题目内容
题目解析
涉及知识点: infer 、 extends
本题其实是基于上一题的。
pop方法 就是每一次删除数组的最后一项,每次返回删除最后一项的数组就可以了。
当然了,如果没有可删除的了,就返回空数组。
题目答案
// ============= Your Code Here =============
type Pop<T extends any[]> = T extends [...infer Rest, infer Last] ? [...Rest] : []
9、实现 Promise.all
题目内容
题目解析
涉及知识点: 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
题目内容
题目解析
涉及知识点: extends
U 的值和类型中的属性type的值相同,所以我们只要判别 T 的 type 值是不是相同即可。
题目答案
// ============= Your Code Here =============
type LookUp<T, U> = T extends { type: U } ? T : never
11、实现 Trim Left
题目内容
题目解析
涉及知识点: infer
代表空格的值有 " " | "\n" | "\t",所以我们只要判断左边有没有空格就可以了,把所有的左边空格过滤掉,返回剩余的值。
题目答案
// ============= Your Code Here =============
type TrimLeft<S extends string> = S extends `${" " | "\n" | "\t"}${infer Rest}` ? TrimLeft<Rest> : S
12、实现 # Trim
题目内容
题目解析
涉及知识点: 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题为一篇进行。