ts 学习记录之关键字

411 阅读1分钟

infer

infer关键字可在 extends 条件语句中推断待推断的类型。

若是在非 extends 条件语句中使用,将会报错。如type F = (data: infer T) => T;,将会报 'infer' declarations are only permitted in the 'extends' clause of a conditional type.ts(1338)

用法:

  • 推断函数的参数类型
type FunParams<T> = T extends (...args: infer Args) => any ? Args : T;

type Fun1 = (name: string, age: number) => string;
type Fun1Params = FunParams<Fun1>; // [name: string, age: number]

type Fun2 = (name: string) => number;
type Fun2Params = FunParams<Fun2>; // [name: string]
  • 推断函数的返回类型
type FunReturn<T> = T extends (...args: any) => infer R ? R : never;

type Fun1Return = FunReturn<Fun1>; // string
type Fun2Return = FunReturn<Fun2>; // number

实际应用

  • 推断数组类型
type Unpacked<T> = T extends (infer R)[] ? R : never;

type Ids = number[];
type Names = string[];
type Users = { id: number; name: string }[];

type Id = Unpacked<Ids>; // number
type Name = Unpacked<Names>; // string
type User = Unpacked<Users>; // {id: number, name: string}

推断数组类型也可直接使用 Ids[number]