使用infer封装通用类型工具

69 阅读1分钟

利用ts的推断功能,完成一些类型工具的比编写

1.获取一个函数的返回值类型(其实ts自带ReturnType<>)

//如果T是个函数,那么该函数返回值类型推断为R
type Return<T> = T extends (...args: any[]) => infer R ? R : T

type sum = (a: number, b: number) => number;
type concat = (a:any[], b:any[]) => any[];

let sumRes : Return<sum>;  // number
let concatRes : Return<concat>;  // any[]

2.获取一个函数的参数的第二个参数的类型

//如果T是个函数,那么该函数第二个参数类型推断为F
type SecondArg<T> = T extends (x: any, y: infer F, ...args: any[]) => any[] ? F : T

type sa =FirstArg<(x: number, y: string, z:boolean) => void> // string

3.获取Promise完成后的类型

//这里考虑了promise嵌套情况,所以用了递归infer
//如果T是个promise对象,那么该promise完成后的值类型推断为P
type PromiseType<T> = T extends Promise<infer P> ? PromiseType<P> : T

type pt = PromiseType<Promise<Promise<string>>>  //string

4.获取数组里面元素的类型

//写成infer K[]会有歧义报错,必须加括号
//如果T是数组,那么该数组成员类型推断为K
type ArrayType<T> = T extends (infer K)[] ? K : T

type ItemType = ArrayType<[string, number]>;  //string | number
type ItemType2 = ArrayType<number[]>;  //number