type-challenge刷题(easy部分)示例详解
作者:goblin_pitcher
这篇文章主要为大家介绍了type-challenge刷题(easy部分)示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
type-challenge刷题
easy
type MyPick<T, K extends keyof T> = {[k in K]: T[k]}; type MyReadonly<T> = {readonly [k in keyof T]: T[k]}; type TupleToObject<T extends readonly (string|number|symbol)[]> = {[k in T[number]]: k}; type First<T extends any[]> = T extends [infer Head, ...unknown[]] ? Head : never; type Length<T extends readonly unknown[]> = T["length"]; // 题目要求readonly数组 type If<C extends boolean, T, F> = C extends true ? T : F; type Concat<T extends unknown[], U extends unknown[]> = [...T, ...U]; type Push<T extends unknown[], U> = [...T, U]; type Unshift<T extends unknown[], U> = [U, ...T]; type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer U) => any ? U : never;
Exclude
原题地址
type MyExclude<T, U> = T extends U ? never : T;
这里有个遗漏的知识点...分配条件类型
当type
参数联合类型时,内部其实是作循环处理的。以Exclude
为例,分配条件类型的实际处理如下
MyExclude<'a'|'b'|'c', 'a'|'b'> = ('a' extends 'a'|'b' ? never : 'a') | ('b' extends 'a'|'b' ? never : 'b') | ('c' extends 'a'|'b' ? never : 'c')
Await
原题地址
type PromiseLike<T = unknown> = {then: (cb: (arg: T)=>unknown) => unknown}; type MyAwaited<T extends PromiseLike> = T extends PromiseLike<infer U> ? (U extends PromiseLike ? MyAwaited<U> : U) : never;
需要实现await
,即const result = await PromiseVal
的await
。
此处实现方式类似Promise A+协议中的resolvePromise
部分,之所以以自定义的PromiseLike
作为Promise
的判断条件,是因为在resolvePromise
中,判断一个对象是否是Promise,是以typeof promise.then === "function"
作为判断条件,这保证了不同pollyfill实现的Promise函数之间可以相互进行链式调用,且满足PromiseLike
的对象都能用async...await
语法。
Include
原题地址
type Eq<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false type Includes<T extends readonly any[], U> = T extends [infer H, ...infer Rest] ? (Eq<H, U> extends false ? Includes<Rest, U>: true) : false;
Include
主体部分还好,最麻烦的是Equal
部分,一开始写的Equal
如下
type Eq<X, Y> = X extends Y ? (Y extends X ? true : false) : false; // 这个是错的,测试用例如下 type check = Eq<boolean, true> // boolean
这里忽略了boolean
其实是个复合类型,根据前面分配条件类型提到的,作为参数传递时会进行遍历
type check = Eq<boolean, true> // boolean // ⬇️ // boolean -> true|false // ====> Eq<true, true>|Eq<false, true> -> true|false -> boolean
直接翻看了'@type-challenges/utils'
的库,发现它是利用function
的定义绕过对象的extends
判断。。这一点比较具有启发性
type Eq<X, Y> = // 这里没有直接进行X和Y的比较,那样会触发分配条件类型 // 因此借助范型的变量T作为桥梁进行比较 (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false
习惯了常规编程语言的语法后,很容易忽略【分配条件类型】这条规则,可以借用中间变量的思想,间接绕过直接的extends
判定
以上就是type-challenge刷题(easy部分)示例详解的详细内容,更多关于type-challenge刷题的资料请关注脚本之家其它相关文章!