infer 类型推断:只能用在条件类型中,用来提取类型的某一个部分的类型,放在不同的位置,就可以取不同位置的类型。动态推导!!!
- 推断函数返回值类型
function getUser(name: string, age: number) {
return { name, age, address: {} }
}
type funType<T> = T extends (...args: any[]) => infer R ? R : never
type funType1 = funType<typeof getUser>
/**
* type funType1 = {
name: string;
age: number;
address: {};
}
*/
- 推断函数参数类型
function getUser(name: string, age: number) {
return { name, age, address: {} }
}
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer P) => any ? P : any
type T1 = MyParameters<typeof getUser> // [name: string, age: number]
- 切换数组元素位置
type TailToHead<T extends any[]> = T extends [infer A,...infer C,infer B] ? [B,A,...C]:any
type x = TailToHead<['jw',30,40,50,'回龙观']> // ["回龙观", "jw", 30, 40, 50]
- 将元组转换成联合类型
type ElementOf<T> = T extends Array<infer R> ? R : any;
type TupleToUnion = ElementOf<[string,number,boolean]> // string | number | boolean