TypeScript 之 深入 infer

171 阅读1分钟

infer的定义:infer 表示在extends条件语句中以占位符出现的等到使用时才推断出来的数据类型。

interface Customer {
    custname: string
    buymoney: number
}

type CystFn = (params: Customer) => string;
// type CustParaTyp = CustFn extends (params: infer P) => number? P : CustFn;

type ParamsTyp<T> = T extends (params: any) => infer R ? R : never;
type CustParaTyp = ParamsTyp<CustFn>

type EleofArr<T> = T extends Array<infer P> ? P : never;
type EleofArrTest = EleOfArr<Array<{name: string, age: number}>>

infer 进阶

下面是vue中一小段infer 的使用源码

export function unref<T>(ref:T):T extends Ref<infer V> ? V : T {
    return inRef(ref) ? (ref.value as any)
}

unref(ref(3)) // 返回类型为 number
unref(ref('111')) // 返回类型为 string
unref(ref({username: 'zhangsan'})) // 返回类型为  {username: 'zhangsan'}