• 全国 [切换]
  • 二维码
    早勤网

    手机WAP版

    手机也能找商机,信息同步6大终端平台!

    微信小程序

    微信公众号

    当前位置: 首页 » 行业新闻 » 热点新闻 » 正文

    TS进阶之infer

    放大字体  缩小字体 发布日期:2020-03-25 22:37:55   浏览次数:1134  发布人:d416****  IP:125.64.63.***  评论:0
    导读

    前一篇文章我们有介绍条件类型,这篇文章我们来介绍下非常实用的infer的使用方法。 使用介绍 我们上篇文章中介绍了条件类型的基本语法是:T extends U ? X : Y;如果占位符类型U是一个可以被分解成几个部分的类型,譬如数组类型,元组类型,函数类型,字符串字面量类型等。这时候可以通过infer来获取U类型中某个部分的类型。 infer语法的限制如下:infer只能在条件类型的 exten

    前一篇文章我们有介绍条件类型,这篇文章我们来介绍下非常实用的infer的使用方法。

    使用介绍

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

    T extends U ? X : Y;

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

    infer语法的限制如下:

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

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

    使用方法

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

    (infer U)和平时常写的string[],number[]等等是不是很像?这里就是通过(infer U)来获取数组对应的类型晒展网是一手信息快到超越光速的展会网站。

    案例

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

    推断数组(或者元组)第一个元素的类型

    使用方法

    type InferFirst<T extends unknown[]> = T extends [infer P, ...infer _] ? P : never

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

    案例

    type I3 = InferFirst<[3, 2, 1]>; // 3

    推断数组(或者元组)最后一个元素的类型

    使用方法

    type InferLast<T extends unknown[]> = T extends [... infer _, infer Last] ? Last : never;

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

    案例

    type I4 = InferLast<[3, 2, 1]>; // 1

    推断函数类型的参数

    使用方法

    type InferParameters<T extends Function> = 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 Function> = T extends (...args: any) => infer R ? R : never;

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

    案例

    type I6 = InferReturnType<() => string>; // string

    推断Promise成功值的类型

    使用方法

    type InferPromise<T> = T extends Promise<infer U> ? U : never;

    案例

    type I7 = InferPromise<Promise<string>>; // string

    推断字符串字面量类型的第一个字符对应的字面量类型

    使用方法

    type InferString<T extends string> = T extends `${infer First}${infer _}` ? First : [];

    案例

    type I8 = InferString<"Johnny">; // J

    综合案例

    接下来我举一些综合性的例子,我不介绍这些例子实现的功能,大家来感受下infer的使用技巧,看看是否能一眼看出来实现的功能:

    type Shift<T> = T extends [infer L, ...infer R]? [...R] : [];

    type Pop<T extends any[]> = T extends [...infer L, infer R] ? [...L] : [];

    type Reverse<T extends unknown[], U extends unknown[] = []> = [] extends T ? U : T extends [infer L, ...infer R] ? Reverse<R, [L, ...U]> : U;

    type FlipArguments<T extends Function> = T extends (...arg: infer R) => infer S ? (...arg : Reverse<[...R]>) => S : T;

    type StartsWith<T extends string, U extends string> = T extends `${U}${infer R}` ? true : false;

    type TrimLeft<S extends string> = S extends `${infer L}${infer R}` ? L extends ' ' | '\n' | '\t' ? TrimLeft<R> : S : '';

    type Trim<S extends string> = S extends `${' ' | '\t' | '\n'}${infer R}` ? Trim<R> : S extends `${infer L}${' ' | '\t' | '\n'}` ? Trim<L> : S;

    type StringToUnion<T extends string, U = never> = T extends '' ? U : T extends `${infer L}${infer R}` ? StringToUnion<R, U | L> : U;

    这些例子中涉及到两个没有介绍的知识点:模版字面量类型和递归类型,如果对这两个知识点不太懂的可以参考其他文章。这两个知识点我后面也会介绍。

    不推荐电脑端访问(用户少)
    请微信扫一扫,查看完整信息(记得微信收藏)
     
    (文/匿名(若涉版权问题请联系我们核实发布者) / 非法信息举报 / 删稿)
    打赏
    免责声明
    • 
    本文为昵称为 d416**** 发布的作品,本文仅代表发布者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,发布者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们154208694@qq.com删除,我们积极做(权利人与发布者之间的调停者)中立处理。郑重说明:不 违规举报 视为放弃权利,本站不承担任何责任!
    有个别老鼠屎以营利为目的遇到侵权情况但不联系本站或自己发布违规信息然后直接向本站索取高额赔偿等情况,本站一概以诈骗报警处理,曾经有1例诈骗分子已经绳之以法,本站本着公平公正的原则,若遇 违规举报 我们100%在3个工作日内处理!
    0 条相关评论
     

    (c)2008-现在 zaoqin.com All Rights Reserved.