infer 用法
1. 获取函数的返回值类型
typescript
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 sumReturn: Return<sum>
let concatReturn: Return<concat>补充
ReturnType:获取函数返回值的类型。Parameters:获取函数参数的类型
typescript
function getUser() {
return { name: 'xxx', age: 10 }
}
type GetUserType = typeof getUser
type ReturnUser = ReturnType<GetUserType>
type ParametersUser = Parameters<GetUserType>ConstructorParameters 获取构造函数的参数类型
typescript
class Person {
name: string
constructor(name: string) {
this.name = name
}
getName() {
console.log(this.name)
}
}
// 获取函数的参数类型
type Params = ConstructorParameters<typeof Person>2. 获取 Promise 的返回值类型
typescript
type PromiseType<T> = T extends Promise<infer R> ? PromiseType<R> : T
type pt = PromiseType<Promise<string>> // string
type pt1 = PromiseType<Promise<Promise<string>>>3. 获取函数的第一个参数类型
typescript
type FirstArg<T> = T extends (first: infer F, ...args: any[]) => any ? F : T
type fa = FirstArg<(name: string, age: number) => void>4. 获取数组元素的类型
typescript
type ArrayType<T> = T extends Array<infer R> ? R : T
type ItemType1 = ArrayType<[string, number]> // string | number
type ItemType2 = ArrayType<string[]> // string