type-challenge刷題(easy部分)示例詳解
type-challenge刷題
內(nèi)容接前文深入學(xué)習(xí)typescript type類型
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數(shù)組 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;
這里有個(gè)遺漏的知識(shí)點(diǎn)...分配條件類型
當(dāng)type
參數(shù)聯(lián)合類型時(shí),內(nèi)部其實(shí)是作循環(huán)處理的。以Exclude
為例,分配條件類型的實(shí)際處理如下
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;
需要實(shí)現(xiàn)await
,即const result = await PromiseVal
的await
。
此處實(shí)現(xiàn)方式類似Promise A+協(xié)議中的resolvePromise
部分,之所以以自定義的PromiseLike
作為Promise
的判斷條件,是因?yàn)樵?code>resolvePromise中,判斷一個(gè)對(duì)象是否是Promise,是以typeof promise.then === "function"
作為判斷條件,這保證了不同pollyfill實(shí)現(xiàn)的Promise函數(shù)之間可以相互進(jìn)行鏈?zhǔn)秸{(diào)用,且滿足PromiseLike
的對(duì)象都能用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; // 這個(gè)是錯(cuò)的,測(cè)試用例如下 type check = Eq<boolean, true> // boolean
這里忽略了boolean
其實(shí)是個(gè)復(fù)合類型,根據(jù)前面分配條件類型提到的,作為參數(shù)傳遞時(shí)會(huì)進(jìn)行遍歷
type check = Eq<boolean, true> // boolean // ?? // boolean -> true|false // ====> Eq<true, true>|Eq<false, true> -> true|false -> boolean
直接翻看了'@type-challenges/utils'
的庫,發(fā)現(xiàn)它是利用function
的定義繞過對(duì)象的extends
判斷。。這一點(diǎn)比較具有啟發(fā)性
type Eq<X, Y> = // 這里沒有直接進(jìn)行X和Y的比較,那樣會(huì)觸發(fā)分配條件類型 // 因此借助范型的變量T作為橋梁進(jìn)行比較 (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false
習(xí)慣了常規(guī)編程語言的語法后,很容易忽略【分配條件類型】這條規(guī)則,可以借用中間變量的思想,間接繞過直接的extends
判定
以上就是type-challenge刷題(easy部分)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于type-challenge刷題的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
TypeScript數(shù)據(jù)結(jié)構(gòu)鏈表結(jié)構(gòu)?LinkedList教程及面試
這篇文章主要為大家介紹了TypeScript數(shù)據(jù)結(jié)構(gòu)鏈表結(jié)構(gòu)?LinkedList教程及面試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02type challenge刷題之(middle 部分)示例解析
這篇文章主要為大家介紹了type challenge刷題之(middle 部分)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08TypeScript手寫一個(gè)簡(jiǎn)單的eslint插件實(shí)例
這篇文章主要為大家介紹了TypeScript手寫一個(gè)簡(jiǎn)單的eslint插件實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02ThreeJS使用紋理貼圖創(chuàng)建一個(gè)我的世界草地方塊
這篇文章主要為大家介紹了ThreeJS使用紋理貼圖創(chuàng)建一個(gè)我的世界草地方塊的實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Typescript?extends?關(guān)鍵字繼承類型約束及條件類型判斷實(shí)現(xiàn)示例解析
這篇文章主要介紹了Typescript?extends?關(guān)鍵字繼承類型約束及條件類型判斷實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08TS報(bào)錯(cuò)Cannot?find?module?'xxx'?or?its?correspo
這篇文章主要為大家介紹了TS報(bào)錯(cuò)Cannot?find?module?'xxx'?or?its?corresponding?type?declarations解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08TypeScript防抖節(jié)流函數(shù)示例詳解
這篇文章主要為大家介紹了TypeScript防抖節(jié)流函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08TypeScript實(shí)現(xiàn)十大排序算法之冒泡排序示例詳解
這篇文章主要為大家介紹了TypeScript實(shí)現(xiàn)十大排序算法之冒泡排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02