typescript 从构造函数选项推断类型

fivyi3re  于 2023-02-10  发布在  TypeScript
关注(0)|答案(1)|浏览(122)

这是可行的,但我确信有更好的方法来实现这一点,我使用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中推断出类型,而无需在调用新示例时通过构造函数传递它们?

qyyhg6bp

qyyhg6bp1#

问题是

z.AnyZodObject不是泛型,并删除任何自动推理。

解决方案

使用z.Schema<T>自动推断类型,因为它是泛型。

示例

...
interface ActionOptions<I, V> {
  name: string;
  inputSchema: z.Schema<I>;
  valueSchema: z.Schema<V>;
  validator: (input: I, value: V) => Promise<[string | null, boolean]>;
}
...

const action = new Action({
  inputSchema: InputSchema,
  valueSchema: ValueSchema,
  name: 'someAction',
  async validator(input, value) {
    return [null, true];
  }
});

相关问题