7、实现 Awaited
题目内容
题目解析
涉及知识点: 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
大部分的案例是可以通过的,但是如果下面这种情况,可以看出依然是报错的
所以需要对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
题目内容
题目解析
涉及知识点: 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
题目内容
题目解析
涉及知识点: extends
这题很简单,只要将两个数组拼接在一块,使用展开运算符即可
题目答案
// ============= Your Code Here =============
type Concat<T extends any[], U extends any[]> = [...T, ...U]
10、实现 Push
题目内容
题目解析
涉及知识点: extends
push只要就是添加一个元素到数组的最后一项,只要把新增的元素放在数组的最后一项就行
题目答案
// ============= Your Code Here =============
type Push<T extends any[], U> = [...T, U]
11、实现 Unshift
题目内容
题目解析
涉及知识点: extends
unshift只要就是添加一个元素到数组的第一项,只要把新增的元素放在数组的第一项就行
题目答案
// ============= Your Code Here =============
type Unshift<T extends any[], U> = [U, ...T]
12、实现 Parameters
题目内容
题目解析
涉及知识点: extends 、 infer
使用infer进行推断
题目答案
// ============= Your Code Here =============
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer K)=> any ? K : never
13、实现 Includes
题目内容
题目解析
涉及知识点: extends 、 infer
-
先判断是否符合数组类型,不符合返回false
-
再推断每一项是否符合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