从另一个Type的值中的类型构造一个Type

时间:2018-08-24 03:50:07

标签: typescript

鉴于我具有以下类型:

export type CommandsTypes = {
  "command1": {
    propA: string;
    propB: number;
  };

  "command2": {
    propC: string;
    propD: number;
  };
};

我想以一种类型安全的方式构造一个对象,例如:

const myCommand: Command<"command1"> = {
  type: "command1",
  payload: {
    propA: "abc",
    probB: 123
  }
}

我的想法是:

export type Command<K extends keyof CommandsTypes> = {
  type: K;
  payload: { [P in CommandsTypes[K]]: any };
};

但是TS似乎不喜欢这样。

有想法吗?

1 个答案:

答案 0 :(得分:2)

对于映射类型,您需要CommandsTypes[K]的键。使用映射类型并保留属性类型的解决方案是:

export type Command<K extends keyof CommandsTypes> = {
    type: K;
    payload: { [P in keyof CommandsTypes[K]]: CommandsTypes[K][P] };
};

但是您实际上并不需要映射类型,这将创建相同的类型:

export type Command<K extends keyof CommandsTypes> = {
   type: K;
   payload: CommandsTypes[K]