Typescript如何编写如下递归类型

我有一个地区类型如下

type AreaInfo = {
    name: string,
    children: AreaInfo[]
}

我现在想在地区类型上面扩展一个额外属性id,这个id属于强业务相关,我并不想直接修改AreaInfo这个类型,而是想通过一个类型工具来扩展这个类型

//type Add = xxxx
type NewAreaInfo = Add(AreaInfo, { id: string })
//最终结果
NewAreaInfo = {
    id: string,
    name: string,
    children: NewAreaInfo
}

请问有什么办法能实现上述的类型转换吗

阅读 3.4k
1 个回答
type Add<T, R> = Omit<T, "children"> & { children: Add<T, R>[] } & R;

如果需要将联合类型合并成一种类型,需要增加一些帮助方法。

type UnionToIntersection<T> = (T extends any ? (k: T) => void : never) extends (k: infer I) => void
  ? I
  : never;

type IntersectionToRecord<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;

type UnionToRecord<T> = IntersectionToRecord<UnionToIntersection<T>>;

type Add<T, R> = UnionToRecord<Omit<T, "children"> & { children: UnionToRecord<Add<T, R>>[] } & R>;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题