TypeScript中Union类型Schema有误时AJV未抛出类型错误
AJV对TypeScript Union类型校验无提示的原因及解决方法
核心原因:AJV是运行时校验器,不绑定TypeScript类型
AJV的工作逻辑完全基于你提供的JSON Schema规则,它不知道你定义的TypeScript Union类型FooOne | FooTwo是什么。如果你的Schema没有正确对应TypeScript Union的分支逻辑,AJV只会按你写的规则校验,不会主动检测和TypeScript类型的不匹配——毕竟它本身不处理TypeScript的类型系统。
你遇到的场景为什么没触发错误
针对你提到的几个问题场景,逐一解释:
enumField仅设为string未限定枚举值:Schema里只写"type": "string",AJV就会允许任何字符串值,它不会主动关联TypeScript的EnumField枚举,自然不会报错。- 未提及
FooOne的extraField:默认情况下AJV允许对象包含Schema未定义的额外属性(除非设置additionalProperties: false),同时如果extraField没被标记为必填,数据里缺少它也不会触发校验错误。 extraField错误设为number类型:只有当校验的数据中extraField是字符串时,AJV才会报错;如果数据里没有这个字段,或者是数字,都符合你写的Schema规则,所以不会提示。
正确的做法:用oneOf映射TypeScript Union类型
TypeScript的Union类型FooOne | FooTwo对应的JSON Schema必须用oneOf关键字来明确两个分支的校验规则,这样AJV才能严格区分两种类型并触发预期的错误。
示例正确的JSON Schema
{ "type": "object", "properties": { "bar": { "type": "string" }, "baz": { "type": "string" }, "enumField": { "type": "string" }, "extraField": { "type": "string" } }, "required": ["bar", "baz", "enumField"], "oneOf": [ { "properties": { "enumField": { "enum": ["ONE"] } }, "required": ["extraField"], "additionalProperties": false }, { "properties": { "enumField": { "enum": ["TWO"] } }, "additionalProperties": false } ] }
这个Schema的作用
- 强制
enumField只能是"ONE"或"TWO",不符合则报错; - 当
enumField为"ONE"时,必须存在extraField且为字符串,缺少或类型错误都会报错; additionalProperties: false禁止对象包含Schema未定义的多余属性,避免不符合TypeScript类型的数据通过校验;oneOf确保数据只能匹配其中一个分支,不会同时符合两个类型的规则。
总结
这不是AJV的固有局限,而是你没有将TypeScript的Union类型正确转换为对应的JSON Schema结构,也没有配置严格的校验规则。只要按照oneOf的方式定义Schema,并开启必要的严格校验选项,AJV就能像校验非Union类型一样,准确抛出类型不匹配的错误。
内容的提问来源于stack exchange,提问作者theahura
相关产品推荐
相关产品推荐

