前景提要
axios 返回默認(rèn)都是 Promise操禀,所以官方的泛型工具 ReturnType 只能獲取到 Promise 的實例,而我想要直接獲取返回 Promise 接收的入?yún)⒌念愋停托枰约菏謩訉懸粋€泛型工具了。
主要還是為了減少代碼中 type 的非必要的導(dǎo)入導(dǎo)出作岖,讓代碼簡潔一點挪捕。
泛型的一些基礎(chǔ)知識
- 泛型中可以使用類似三元運(yùn)算的條件類型
type IsString <S> = S extends string ? true : false;
IsString <'字符串'>; // true
- infer 關(guān)鍵字
在條件類型中使用 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