【Typescript】type-challenges:easy级别题目(下)

85 阅读2分钟

1681442893877.png

7、实现 Awaited

题目内容

1681702961523.png

题目解析

涉及知识点: infer 、 递归调用

1、首先先判断返回值是否是Promise类型,不是的话,直接返回return

2、然后判断返回的Promise中包裹的T是不是符合promise类型,如果不是,直接返回T类型

3、如果返回的依然是promise类型包裹的promise类型,就继续递归调用

题目答案

初版答案

    
// ============= Your Code Here =============
type MyAwaited<T extends Promise<unknown>> =  T extends Promise<infer K> 
                                              ? K extends Promise<unknown>
                                                ? MyAwaited<K>
                                                  : K
                                              : never

大部分的案例是可以通过的,但是如果下面这种情况,可以看出依然是报错的

1681704004280.png

所以需要对promise进行一些约束,最终版如下:

interface MyPromiseLike<T> { then: (onfulfilled: (arg: T) => any) => any }

type MyAwaited<T extends MyPromiseLike<any>> = 
  T extends MyPromiseLike<infer R> ?
    R extends MyPromiseLike<any> ?
      MyAwaited<R> :
      R
  : T;

8、实现 If

题目内容

1681704700722.png

题目解析

涉及知识点: extends

这题很简单,C必须是boolean类型的,如果C为true,就返回T,如果C为false,就返回F

题目答案
// ============= Your Code Here =============
type If<C extends boolean, T, F> =  C extends true ? T : F
   

9、实现 Concat

题目内容

1681705566599.png

题目解析

涉及知识点: extends

这题很简单,只要将两个数组拼接在一块,使用展开运算符即可

题目答案
// ============= Your Code Here =============
type Concat<T extends any[], U extends any[]> = [...T, ...U]

10、实现 Push

题目内容

1681705700352.png

题目解析

涉及知识点: extends

push只要就是添加一个元素到数组的最后一项,只要把新增的元素放在数组的最后一项就行

题目答案
// ============= Your Code Here =============
type Push<T extends any[], U> = [...T, U]

11、实现 Unshift

题目内容

1681705818679.png

题目解析

涉及知识点: extends

unshift只要就是添加一个元素到数组的第一项,只要把新增的元素放在数组的第一项就行

题目答案
// ============= Your Code Here =============
type Unshift<T extends any[], U> = [U, ...T]

12、实现 Parameters

题目内容

1681705931385.png

题目解析

涉及知识点: extends 、 infer

使用infer进行推断

题目答案
// ============= Your Code Here =============
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer K)=> any ? K : never

13、实现 Includes

题目内容

1681706176662.png

题目解析

涉及知识点: extends 、 infer

  1. 先判断是否符合数组类型,不符合返回false

  2. 再推断每一项是否符合true,如果是就返回true,不是就继续递归调用

题目答案
// ============= Your Code Here =============
type Includes<T extends readonly any[], U> =  T extends [infer First, ...infer Rest] ? 
                                              (Equal<First, U> extends true ? true : Includes<Rest, U>)
                                              : false