如何创建AJV的JSONSchemaType验证number|string联合类型数组?
如何用AJV的JSONSchemaType正确定义包含数字和字符串的混合数组?
这个问题的核心是AJV的TypeScript类型系统需要明确识别联合类型对应的JSON Schema结构。你遇到的错误是因为TypeScript无法自动将anyOf结构推断为JSONSchemaType<string | number>,我们可以通过两种简洁的方式解决:
方法1:单独定义元素的Schema并指定类型
先把数组元素的Schema单独抽离出来,明确标注它对应string | number的联合类型,这样TypeScript就能正确关联类型:
import { JSONSchemaType } from 'ajv'; type MixedArray = Array<number | string>; // 单独定义混合元素的Schema const mixedItemSchema: JSONSchemaType<string | number> = { anyOf: [ { type: 'number' }, { type: 'string' }, ] }; // 定义数组的Schema const Mixed: JSONSchemaType<MixedArray> = { type: 'array', items: mixedItemSchema };
方法2:直接在items中显式断言类型
如果不想单独抽离代码,也可以直接在items的Schema后添加类型断言,告诉TypeScript这个结构对应的是联合类型的Schema:
import { JSONSchemaType } from 'ajv'; type MixedArray = Array<number | string>; const Mixed: JSONSchemaType<MixedArray> = { type: 'array', items: { anyOf: [ { type: 'number' }, { type: 'string' }, ] } as JSONSchemaType<string | number>, // 显式断言联合类型Schema };
错误原因解释
原来的写法中,TypeScript会默认尝试将items的Schema匹配为单一类型的JSONSchemaType(比如仅number或仅string),而非联合类型的。AJV的JSONSchemaType对联合类型的处理需要明确的类型标注——要么通过单独变量指定类型,要么通过断言让TypeScript识别anyOf结构对应的是string | number的联合类型Schema。
调整后的Schema可以完美校验你的样本数据['dfdf', 9, 0, 'sdfdsf']。
内容的提问来源于stack exchange,提问作者Harley Lang
相关产品推荐
相关产品推荐

