鉴于我具有以下类型:
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似乎不喜欢这样。
有想法吗?
答案 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]