创建带泛型属性的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
相关产品推荐
相关产品推荐

