TypeScript之infer的作用

typescript中的infer具有推断类型变量的作用,当我们不知道参数是什么的时候可以使用借助infer这个关键字。让我们来看下具体的使用方法:

1、当泛型是数组时使用

例子:获取数组的最后一项元素

type Last<T extends unknown[]> = T extends [infer F, ...infer R]
? R['length'] extends 0 
  ? F
  : Last<R> 
: never

// 这里利用ES6的是解构数组,R参数会是个数组,根据数组的长度判断是否已经到最后一个元素

2、当泛型是字符串时使用

例子:去掉字符串左边的为空的部分

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

/**
解析:先通过extends判断S是否能赋值给`${Blank}${infer R}` 如果可以,说明S结构肯定以空字符串或者\n,\t开头的,大概是这样的' str'或者'
\n str或者'\t str'',满足条件的情况下,再次递归调用MyTrimLeft把剩下的字符传进入(通过infer关键字会自动推断R是剩下的所有字符)
**/

3、当不知道函数的返回值类型时使用

例子:获取函数的返回值类型

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never

type rt = ReturnType<() => Promise<number>> // 输出Promise<number>
type rt1 = ReturnType<() => number> // 输出number

总结:在TS的类型体操中可以灵活的利用infer关键字实现各种需求。比如利用infer关键字实现去掉字符串右边的空白以及字符串左右两边的空白字符,有兴趣的同学可以自己试试。

 

posted @ 2022-09-15 10:28  闯入码途的水产人  阅读(551)  评论(0编辑  收藏  举报