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

如何创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:08:21