如何为未知子类型的泛型正确编写类型定义?

时间:2019-09-30 18:55:06

标签: typescript generics

我正在尝试使用泛型为将从服务器接收到的数据编写类型定义。数据将具有以下形状(为简单起见,假设所有数据都将如下所示):

interface Commands {
  Foo: IFoo;
  Bar: IBar;
  // More commands of same style
}

interface Command<K extends keyof Commands> {
  header: K;
  data: Commands[K];
}

该定义适用于已知类型的命令,但是由于将从服务器接收数据,因此在编译时其类型将是未知的。我试图为每个可能的命令编写一个类型,但是我没有找到一种编译器可以正确推断类型的解决方案。

Typescript playground demo


此解决方案有效,但并不理想,因为存在许多不同的命令,并且如果编译器可以自行完成此操作会更好。

type UnknownCommand3 = Command<'Foo'> | Command<'Bar'> // Works but not ideal
const c: UnknownCommand3 = { header: 'Foo', data: { bar: '312321' }}

谢谢:)

1 个答案:

答案 0 :(得分:0)

我将使用mapped typelookup的属性来获取所需的并集:

type UnknownCommand = { [K in keyof Commands]: Command<K> }[keyof Commands];

计算结果为Command<"Foo"> | Command<"Bar">,如果您向Commands添加属性,它将自动获得更多的工会成员。

希望有帮助。祝你好运!

Link to code