You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建带泛型属性的Zod递归对象类型时遇类型不兼容问题

为递归泛型类型创建Zod Schema时的类型兼容问题

我正在尝试为以下递归泛型类型创建Zod Schema:

type FieldSpec<Fields extends string> = {
    typ: "simple";
    field: Fields;
} | {
  // typ: "div";
  typ: "div" | "/";
  numerator: FieldSpec<Fields>;
  divisor: FieldSpec<Fields>;
} | {
  // typ: "mul";
  typ: "mul" | "*";
  fields: [FieldSpec<Fields>, FieldSpec<Fields>, ...FieldSpec<Fields>[]];
} | {
  // typ: "add";
  typ: "add" | "+";
  fields: [FieldSpec<Fields>, FieldSpec<Fields>, ...FieldSpec<Fields>[]];
};

使用泛型函数创建Schema后,数学运算类型的z.infer结果是正确的,但"simple"类型的z.infer结果不符合预期,得到的类型是:

type TS = { [k in keyof z.objectUtil.addQuestionMarks<z.baseObjectOutputType<{
    typ: z.ZodLiteral<"simple">;
    field: z.ZodType<Fields, z.ZodTypeDef, Fields>;
}>, any>]: z.objectUtil.addQuestionMarks<...>[k]; }

这导致Schema无法通过类型检查,报错信息如下:

Types of property 'field' are incompatible.
            Type 'addQuestionMarks<baseObjectOutputType<{ typ: ZodLiteral<"simple">; field: ZodType<Fields, ZodTypeDef, Fields>; }>, any>["field"] | undefined' is not assignable to type 'Fields'.
              'Fields' could be instantiated with an arbitrary type which could be unrelated to 'addQuestionMarks<baseObjectOutputType<{ typ: ZodLiteral<"simple">; field: ZodType<Fields, ZodTypeDef, Fields>; }>, any>["field"] | undefined'.

编辑补充:我尝试将"simple"的field解析为枚举也失败了;若将"simple"的类型指定为z.ZodType<{ type: "simple"; field: Fields }>,会在"simple"定义处出现如下错误:

Type 'ZodObject<{ type: ZodLiteral<"simple">; field: ZodType<Fields, ZodTypeDef, Fields>; }, "strip", ZodTypeAny, { [k in keyof addQuestionMarks<baseObjectOutputType<{ type: ZodLiteral<...>; field: ZodType<...>; }>, any>]: addQuestionMarks<...>[k]; }, { [k in keyof baseObjectInputType<...>]: baseObjectInputType<...>[k]; }>' is not assignable to type 'ZodType<{ type: "simple"; field: Fields; }, ZodTypeDef, { type: "simple"; field: Fields; }>'.
  The types of '_type.field' are incompatible between these types.
    Type 'addQuestionMarks<baseObjectOutputType<{ type: ZodLiteral<"simple">; field: ZodType<Fields, ZodTypeDef, Fields>; }>, any>["field"] | undefined' is not assignable to type 'Fields'.
      'Fields' could be instantiated with an arbitrary type which could be unrelated to 'addQuestionMarks<baseObjectOutputType<{ type: ZodLiteral<"simple">; field: ZodType<Fields, ZodTypeDef, Fields>; }>, any>["field"] | undefined'.ts(2322)

希望能得到解决该类型不兼容问题的思路。

内容的提问来源于stack exchange,提问作者Alpvax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:27:09