关于自定义一个泛型工具

前景提要

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

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):