打字稿:将对象的联合转换为普通联合

时间:2020-12-22 15:38:28

标签: javascript typescript

如何将对象的联合转换为具有对象值的普通联合。一个例子:

type Foo = {};
type Bar = {};
type Baz = {};
type Qux = {};

type Input = {
  foo: Foo,
  bar: Bar,
} | {
  bar: Bar,
  baz: Baz,
} | {
  qux: Qux,
};

type Expected = Foo | Bar | Baz | Qux;

注意联合对象的键可能会相交(例如bar)。希望解决方案能让我解开嵌套的类型。

TS Playground

1 个答案:

答案 0 :(得分:2)

您想要获取类似 a ValueOf<T> type(即 T[keyof T])的内容,并将其分发T 的工会成员,以便如果 {{1例如,}} 是 T,那么 A | B | CTransform<T>。您可以使用 distributive conditional type 来获得该行为:

A[keyof A] | B[keyof B] | C[keyof C]

让我们测试一下:

type Transform<T> = T extends any ? T[keyof T] : never;

看起来不错。

Playground link to code