• TS中的info用法


    我们上篇文章中介绍了条件类型的基本语法是:

     T extends U ? X : Y;
    
    • 1

    如果占位符类型U是一个可以被分解成几个部分的类型,譬如数组类型,元组类型,函数类型,字符串字面量类型等。这时候可以通过infer来获取U类型中某个部分的类型。

    infer语法的限制如下:

    • infer只能在条件类型的 extends 子句中使用
    • infer得到的类型只能在true语句中使用, 即X中使用

    推断数组(或者元组)的类型

    使用方法

    type InferArray<T> = T extends (infer U)[] ? U : never;
    
    • 1

    (infer U)和平时常写的string[],number[]等等是不是很像?这里就是通过(infer U)来获取数组对应的类型。

    案例

    type I0 = InferArray<[number, string]>; // string | number
    type I1 = InferArray<string[]>; // string
    type I2 = InferArray<number[]>; // number
    
    • 1
    • 2
    • 3

    案例

    type Infer<T> = T extends (infer U) ? U : never;
    type I3 = Infer<number>; // number
    
    • 1
    • 2

    推断数组(或者元组)第一个元素的类型
    使用方法
    type InferFirst = T extends [infer P, …infer _] ? P : never
    复制代码

    [infer P, … infer _]中infer P获取的是第一个元素的类型,而…infer 获取的是数组其他剩余元素的数组类型;
    特别说明下,我们例子汇总不需要使用其他元素的类型,所以用

    案例
    type I3 = InferFirst<[3, 2, 1]>; // 3
    复制代码
    推断数组(或者元组)最后一个元素的类型
    使用方法
    type InferLast = T extends [… infer _, infer Last] ? Last : never;
    复制代码

    这个和推断数组第一个元素的类型类似,…infer _获取的是最后一个元素之前的所有元素类型,infer Last获取的是最后一个元素的类型。

    案例
    type I4 = InferLast<[3, 2, 1]>; // 1
    复制代码
    推断函数类型的参数
    使用方法
    type InferParameters = T extends (…args: infer R) => any ? R : never;
    复制代码

    …args 代表的是函数参数组成的元组, infer R代表的就是推断出来的这个函数参数组成的元组的类型。

    案例
    type I5 = InferParameters<((arg1: string, arg2: number) => void)>; // [string, number]
    复制代码
    推断函数类型的返回值
    使用方法
    type InferReturnType = T extends (…args: any) => infer R ? R : never;
    复制代码

    和前面的推断函数类型的参数类似,=> 后面的infer R代表的就是推断出来的函数的返回值类型。

    案例
    type I6 = InferReturnType<() => string>; // string
    复制代码
    推断Promise成功值的类型
    使用方法
    type InferPromise = T extends Promise ? U : never;

    复制代码
    案例
    type I7 = InferPromise; // string
    复制代码
    推断字符串字面量类型的第一个字符对应的字面量类型
    使用方法
    type InferString = T extends ${infer First}${infer _} ? First : [];
    复制代码
    案例
    type I8 = InferString<“Johnny”>; // J

    作者:chonglingliu
    链接:https://juejin.cn/post/7110582223052472328
    来源:稀土掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    时序动作定位 | ActionFormer: 使用Transformers动作时刻
    多测师肖sir_高级金牌讲师_jenkins搭建
    超全面的SpringCloud Alibaba电子版教程,我司已用三年(新人老人万能通用版)
    通过 ffmpeg命令行 调节视频播放速度
    【Boot开发】Git工具详解,服务器搭建java和mysql环境由systemctl管理
    Day01 SpringBoot第一次笔记---运维实用篇
    SPN的相关利用
    C++ 跨平台UI框架 JUCE
    thinkphp5.0.24反序列化链子分析
    自动化运维工具Ansible(1)基础
  • 原文地址:https://blog.csdn.net/m0_46672781/article/details/127700640