feng xiaohan

TS高级-infer

用于在泛型中推导类型。它通常与extends关键字一起使用,用于从一个类型中提取出另一个类型,并将其作为泛型参数的类型。

应用

  • 定义一个类型就返回一个类型

    type Type<T> = T extends Array<infer U> ? U : T;
    // infer U会充当一个占位符,去读取Array里的类型,然后再返回
    
    type A = Type<(string | number)[]>; // type A = string | number
    type B = Type<boolean>; // type B = boolean
    

    例 2:

    // 定义一个类型只能返回元组类型,其他的类型返回都会为never
    type Type<T> = T extends Array<infer U> ? U : never;
    
    type T = [string, number];
    type union = Type<T>; // 返回一个有T类型里的值组成的联合类型 type union = string | number
    

类型提取和删除

type First<T extends any[]> = T extends [infer one, infer two, infer three]
  ? one
  : [];

提取头部元素

type First<T extends any[]> = T extends [infer one, ...any[]] ? one : [];

type Arr = ["a", "b", "c"];
type a = First<Arr>; // type a = 'a'

提取尾部元素

type Last<T extends any[]> = T extends [...any[], infer last] ? last : [];

type Arr = ["a", "b", "c"];
type a = Last<Arr>; // type a = 'c'

删除尾部元素

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

type Arr = ["a", "b", "c"];
type a = Last<Arr>; // type a = ['a', 'b']

删除头部元素

type Shift<T extends any[]> = T extends [shiftOne, ...infer Rest] ? Rest : [];

type Arr = ["a", "b", "c"];
type a = Shift<Arr>; // type a = ['b', 'c']

infer 递归

使用infer递归实现数组反转。

**实现思路:***定义一个ReverArr使用infer将数组的第一个取出来放到最后一个元素中,剩下的元素继续组成数组传入这个ReverArr,实现递归调用,直到再也没有剩下的元素返回。*

type ReverArr<T extends any[]> = T extends [infer First, ..infer rest] ? [...ReverArr<rest>, First] : T

type Arr = [1, 2, 3, 4]
type ArrRe = ReverArr<Arr> // type ArrRe = [4, 3, 2, 1]