美文网首页让前端飞
关于自定义一个泛型工具

关于自定义一个泛型工具

作者: 虚拟J | 来源:发表于2021-07-18 15:36 被阅读0次

    前景提要

    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

    相关文章

      网友评论

        本文标题:关于自定义一个泛型工具

        本文链接:https://www.haomeiwen.com/subject/mifapltx.html