【发布时间】:2021-03-18 14:11:56
【问题描述】:
我试图通过在聊天命令中引入静态约束来减少代码量和错误。 命令用名称和参数描述。这是我得到的:
type ArgumentTypeName = 'string' | 'number' | 'user';
type CommandArguments<T> = { [k in keyof T]: ArgumentTypeName };
type CommandHandler<T> = (args: T) => void;
type Command<T> = {
name: string;
arguments: CommandArguments<T>;
handler: CommandHandler<T>;
}
我不知道如何从Command<T> 的arguments 中获取T 类型,因此它可以正确影响handler。
到目前为止,我得到了一个具有正确键的类型,但所有值都是unknown。像这样:
arguments = { arg1: 'string' }
// handler: (args: { arg1: unknown }) => void
我也试过约束arguments,想着如果不指定T,就会从arguments推断出来,但是没用:
type ArgumentName<T> =
T extends string ? 'string' :
T extends number ? 'number' :
T extends User ? 'user' :
never;
type CommandArguments<T> = { [k in keyof T]: ArgumentName<T[k]> };
type CommandHandler<T> = (args: T) => void;
type Command<T> = {
name: string;
arguments: CommandArguments<T>;
handler: CommandHandler<T>;
}
我怎样才能根据T 的属性CommandArguments<T> 向后推断CommandArguments<T>?
所以我得到CommandArguments<T> → T → CommandHandler<T>?
还是有我没有想到的不同方法?
编辑: 使用这个的代码示例:
/*
In another file:
const commands: Command<any>[] = [];
export function createCommand<T>(cmd: Command<T>) {
commands.push(cmd);
}
*/
createCommand({
name: 'add',
arguments: {
a: 'number',
b: 'number'
},
handler: (args) => {
// (parameter) args: { a: unknown; b: unknown; }
// Error: Object is of type 'unknown'. ts(2571)
console.log(args.a + args.b);
},
});
【问题讨论】:
-
请分享您的
handler功能。我的意思是使用这些类型的代码 -
@captain-yossarian 添加
标签: typescript typescript-generics