前景提要
axios 返回默认都是 Promise,所以官方的泛型工具 ReturnType 只能获取到 Promise 的实例,而我想要直接获取返回 Promise 接收的入参的类型,就需要自己手动写一个泛型工具了。
主要还是为了减少代码中 type 的非必要的导入导出,让代码简洁一点。
泛型的一些基础知识
- 泛型中可以使用类似三元运算的条件类型
type IsString <S> = S extends string ? true : false;
IsString <'字符串'>; // true
- infer 关键字
在条件类型中使用 infer 来获取类型入参的组成部分。(类似于声明性地引入了一个新的泛型类型变量)
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
网友评论