關于ts自定義一個泛型工具

前景提要

axios 返回默認都是 Promise,所以官方的泛型工具 ReturnType 只能獲取到 Promise 的實例,而我想要直接獲取返回 Promise 接收的入?yún)⒌念愋停托枰约菏謩訉懸粋€泛型工具了。

主要還是為了減少代碼中 type 的非必要的導入導出,讓代碼簡潔一點。

泛型的一些基礎知識
  • 泛型中可以使用類似三元運算的條件類型
type IsString <S> = S extends string ? true : false;
IsString <'字符串'>; // true
  • infer 關鍵字

在條件類型中使用 infer 來獲取類型入?yún)⒌慕M成部分。(類似于聲明性地引入了一個新的泛型類型變量)

type Chestnut<T> = T extends (infer C)[] ? C : never;
type isNumber = Chestnut<number[]>; // number

自定義泛型工具

先看一下 ReturnType 的定義:

type ReturnType<T extends (...args: any) => any> = T extends (
  ...args: any
) => infer R
  ? R
  : any;

然后按照這個改造一下:

type ReturnPromiseType<T extends (...args: any) => any> = T extends (
  ...args: any
) => infer R
  ? R extends Promise<infer PR>
    ? PR
    : any
  : any;

后面想到一個更簡潔的寫法:

type ReturnPromiseType<T extends (...args: any) => any> = T extends (
  ...args: any
) => Promise<infer PR>
  ? PR
  : ReturnType<T>;

最后

最后,只要在聲明文件(以 .d.ts 為后綴的文件)中聲明一下就好了。

declare global {
  //......代碼
}

參考鏈接:
https://www.typescriptlang.org/docs/handbook/2/conditional-types.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容