Typescript如何实现数组元素类型,要么是A,要么是B?

image.png
我有两个类型A和B,我希望实现一个类型TestType,这个类型数组元素,要么是A要么是B,图上两种写法都无法满足需求,请问应该如何实现这个需求

阅读 1.8k
3 个回答
type PickOne<Type1, Type2> =
  | ({
      [K in keyof Type1]: Type1[K]
    } & { [K in keyof Type2]?: never })
  | ({
      [K in keyof Type2]: Type2[K]
    } & { [K in keyof Type1]?: never })

使用:

type TestType = PickOne<A,B>[]

更新

type UnionKeys<T> = T extends T ? keyof T : never
type StrictUnion<T, TAll> = T extends T
  ? T & Partial<Record<Exclude<UnionKeys<TAll>, keyof T>, never>>
  : never
type AB = A | B
export type TestType = StrictUnion<AB, AB>

type TestType = Array<A> | Array<B>
抱歉之前理解有误没有看太清楚
以下为根据楼上老哥的答案进行的修改,添加了 A,B有相同key的情况,如有错误还是提出予以改正

type PickOne<Type1, Type2> =
  | ({
      [K in keyof Type1]: Type1[K]
    } & { [K in keyof Type2]?: K extends keyof Type1? Type1[K] : never })
  | ({
      [K in keyof Type2]: Type2[K]
    } & { [K in keyof Type1]?: K extends keyof Type2? Type2[K] : never })

更新,可以参考评论链接。

// 在其他答案基础上,改进下

type PickOne<T1, T2> =
  | (T1 & { [K in keyof T2]?: K extends keyof T1 ? T1[K] : never })
  | (T2 & { [K in keyof T1]?: K extends keyof T2 ? T2[K] : never })

type TestType = PickOne<A, B>

下面答案有误。


这不是元组吗? 你看:https://www.typescriptlang.org/docs/handbook/2/objects.html#t...

type TestType = [...(A | B)[]]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏