keyof 实现及其逆向操作,联合类型转元祖类型,Typescript类型定义中的递归

496 阅读1分钟

keyof 实现

type keyof<T> = T extends { [key in infer R]: any } ? R : never

image.png

逆向实现在文末

联合类型转元祖(递归实现)

type UnionToInterFunction<U> =
        (U extends any ? (k: () => U) => void : never) extends
        ((k: infer I) => void) ? I : never
//把联合类型转成多态函数的定义

type Last<T, U = UnionToInterFunction<T>> = U extends () => any ? ReturnType<U> : never
//获取联合类型的最后一个类型(原理在于获取多态函数的返回值类型总是返回最后一个)

type OmitLast<T> = Exclude<T, Last<T>>
//获取联合类型的除最后一个类型以外的类型

type UnionToArr<T, Arr extends any[] = any[]> = [T] extends [never] ? [] : [...UnionToArr<OmitLast<T>, Arr>, Last<T>]
//递归获取最后一个类型然后填充到元祖第一位

type arrof<T> = [Exclude<T, Last<T>>] extends [never] ? UnionToArr<valueof<T>> : UnionToArr<T>
//对方法进行包装,让其可以把对象类型的值的联合也能转换为元祖

image.png

逆向keyof

keyof 是获取对象类型中的键的联合类型,所以其逆向objof 是把一个联合类型转换为一个各个联合类型为键的对象类型

type objof<T> = [T] extends [never] ? { [key in Last<T>] } :objof<OmitLast<T>> & { [key in Last<T>] }

image.png

参考链接