簡體   English   中英

從構造函數選項推斷類型

[英]infer type from constructor options

這行得通,但我確信有更好的方法可以做到這一點,我正在使用 zod 對我對用戶零控制的值進行模式驗證。

const SchemaValue = z.object({
  translatedValue: z.string().or(z.number())
});

const SchemaInput = z.object({
  truncate: z.number()
});

然后我有一個非常簡單的 class,它采用這些模式並執行驗證,並將類型推斷回傳遞給“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 推斷類型,而無需在調用新實例時將它們傳遞給構造函數?

問題

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];
  }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM