使用AJV进行TypeScript混合类型验证的类型兼容问题
解决Ajv v8.12.0中混合类型
defaultValue的TS类型错误问题 针对你遇到的ModuleJsonSectionInput里defaultValue(string | boolean | number | string[])混合类型导致的TS类型错误问题,以下是无需使用as any的可行方案:
方案1:用oneOf精确定义子类型Schema + 自动推导TS类型
Ajv对oneOf的TS类型推导支持更精准,能完美匹配你的混合类型定义:
import { TypeOf } from "ajv"; // 定义Schema时用oneOf枚举每个子类型的约束 const moduleJsonSectionInputSchema = { type: "object", properties: { // 其他属性... defaultValue: { oneOf: [ { type: "string" }, { type: "boolean" }, { type: "number" }, { type: "array", items: { type: "string" } } // 明确数组元素为string ] } }, required: [] // 根据实际需求添加必填字段 } as const; // 自动推导TS类型,无需手动维护 type ModuleJsonSectionInput = TypeOf<typeof moduleJsonSectionInputSchema>;
这种方式下,TS会自动将defaultValue识别为string | boolean | number | string[],完全匹配你的需求,且Schema和TS类型保持单一可信源。
方案2:用JSONSchemaType泛型约束Schema与TS类型对齐
如果你需要手动维护TS类型,可通过Ajv提供的JSONSchemaType泛型强制Schema与TS类型严格匹配,编写阶段就能发现类型不一致问题:
import { JSONSchemaType } from "ajv"; // 先定义TS类型 type ModuleJsonSectionInput = { // 其他属性... defaultValue: string | boolean | number | string[]; }; // 用JSONSchemaType约束Schema必须匹配TS类型 const moduleJsonSectionInputSchema: JSONSchemaType<ModuleJsonSectionInput> = { type: "object", properties: { // 其他属性... defaultValue: { oneOf: [ { type: "string" }, { type: "boolean" }, { type: "number" }, { type: "array", items: { type: "string" } } ] } }, required: [] };
此方案会在编写Schema时实时校验类型一致性,避免后续出现不匹配的TS错误。
为什么之前的写法会报错
直接使用type: ["string", "boolean", "number", "array"]的写法,Ajv的TS类型推导会将数组类型解析为unknown[],与你定义的string[]不匹配,从而触发类型错误。而oneOf能明确指定数组的元素类型,让TS推导结果完全对齐你的需求。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

