这是可行的,但我确信有更好的方法来实现这一点,我使用zod对用户无法控制的值进行模式验证。
const SchemaValue = z.object({
translatedValue: z.string().or(z.number())
});
const SchemaInput = z.object({
truncate: z.number()
});
然后,我有一个非常简单的类,它接受这些模式并执行验证,还将类型推断回传递给“Action”的方法。
interface ActionOptions<I, V> {
name: string;
inputSchema: z.AnyZodObject;
valueSchema: z.AnyZodObject;
validator: (input: I, value: V) => Promise<[string | null, boolean]>;
}
export class Action<I, V> {
options: ActionOptions<I, V>;
constructor(options: ActionOptions<I, V>) {
this.options = options;
}
async run(value: V, input: I): Promise<void> {
// additional code is here to validate value & input against valueSchema and inputSchema
await this.options.validator(
input,
value,
);
}
}
然后我这样使用它:
const action = new Action<z.infer<typeof InputSchema>, z.infer<typeof ValueSchema>>({
inputSchema: InputSchema,
valueSchema: ValueSchema,
name: 'someAction',
async validator(input, value) {
return [null, true];
}
});
这是可行的,输入和值验证器的智能感知是正确的,但是我只是忍不住想有一个更好的方法来实现这一点,而不必通过类型传递给构造函数,我问的唯一原因是我试图使Action
的使用尽可能简单!
我想知道是否有一种方法可以从inputSchema和valueSchema中推断出类型,而无需在调用新示例时通过构造函数传递它们?
1条答案
按热度按时间qyyhg6bp1#
问题是
z.AnyZodObject
不是泛型,并删除任何自动推理。解决方案
使用
z.Schema<T>
自动推断类型,因为它是泛型。示例