从对象类型构造联合类型

Construct a union type from an object type

我有一个看起来像这样的类型:

type MessageTypes = {
  foo: { bar: string };
  baz: { qux: string, quux: string };
  corge: { grault: number };
};

我想定义一个类型,它给我类似的东西:

| {
  op: 'foo';
  data: { bar: string };
}
| {
  op: 'baz';
  data: { qux: string, quux: string };
}
| {
  op: 'corge';
  data: { grault: number };
}

到目前为止我最接近的是:

type KnownMessage = {
  [T in keyof MessageTypes]: { op: T; data: MessageTypes[T] };
};

但是,我不关心这种类型的键,只关心值。

使用 MessageTypes 定义我的特殊联合类型的最佳方法是什么?

非常接近;只需像这样获得所有值的联合:

type KnownMessage = {
  [T in keyof MessageTypes]: { op: T; data: MessageTypes[T] };
}[keyof MessageTypes];

之所以有效,是因为:

{
    foo: 1,
    bar: 2,
}["foo" | "bar"]

生成值 12 的并集 => 1 | 2