我正在尝试使用泛型为将从服务器接收到的数据编写类型定义。数据将具有以下形状(为简单起见,假设所有数据都将如下所示):
interface Commands {
Foo: IFoo;
Bar: IBar;
// More commands of same style
}
interface Command<K extends keyof Commands> {
header: K;
data: Commands[K];
}
该定义适用于已知类型的命令,但是由于将从服务器接收数据,因此在编译时其类型将是未知的。我试图为每个可能的命令编写一个类型,但是我没有找到一种编译器可以正确推断类型的解决方案。
此解决方案有效,但并不理想,因为存在许多不同的命令,并且如果编译器可以自行完成此操作会更好。
type UnknownCommand3 = Command<'Foo'> | Command<'Bar'> // Works but not ideal
const c: UnknownCommand3 = { header: 'Foo', data: { bar: '312321' }}
谢谢:)
答案 0 :(得分:0)
我将使用mapped type和lookup的属性来获取所需的并集:
type UnknownCommand = { [K in keyof Commands]: Command<K> }[keyof Commands];
计算结果为Command<"Foo"> | Command<"Bar">
,如果您向Commands
添加属性,它将自动获得更多的工会成员。
希望有帮助。祝你好运!