# ajv-keywords 中文文档

规范地址：https://npmcn.com/package/ajv-keywords/

版本：5\.1\.0
npm 元数据更新时间：2022-06-13T02:34:05.200Z
中文译文更新时间：2026-11-05T15:24:08.960Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/ajv-keywords
原文对照：https://npmcn.com/package/ajv-keywords/?lang=original
项目主页：https://github.com/epoberezkin/ajv-keywords#readme
源码仓库：https://github.com/epoberezkin/ajv-keywords

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：132 kB，159 个文件
- 模块格式：CommonJS
- TypeScript 类型：包内自带
- 运行依赖：1 个
- peer 依赖：ajv ^8\.8\.2
- 首次发布：2016-06-05T21:00:43.250Z
- 最新版本发布：2021-11-21T19:42:21.146Z
- 近 30 天下载量：347313401（2026-10-05 至 2026-11-03，npm 官方下载统计）
- 已发布版本数：43（近 12 个月 0 个）

## 中文简介

Ajv JSON 验证器的附加 JSON- Schema 关键词

## 安装

```sh
npm install ajv-keywords
```

也可以使用：`pnpm add ajv-keywords`、`yarn add ajv-keywords`、`bun add ajv-keywords`

## README

# ajv 关键词

自定义 JSON-Schema 关键词 [亚日弗](https://github.com/epoberezkin/ajv) 校验符

[![build](https://github.com/ajv-validator/ajv-keywords/workflows/build/badge.svg)](https://github.com/ajv-validator/ajv-keywords/actions?query=workflow%3Abuild) [![npm](https://img.shields.io/npm/v/ajv-keywords.svg)](https://www.npmjs.com/package/ajv-keywords) [![npm downloads](https://img.shields.io/npm/dm/ajv-keywords.svg)](https://www.npmjs.com/package/ajv-keywords) [![coverage](https://coveralls.io/repos/github/ajv-validator/ajv-keywords/badge.svg?branch=master)](https://coveralls.io/github/ajv-validator/ajv-keywords?branch=master) [![gitter](https://img.shields.io/gitter/room/ajv-validator/ajv.svg)](https://gitter.im/ajv-validator/ajv)

**请注意**: 此读取文件用于 [ajv-关键词 v5.0.0](https://github.com/ajv-validator/ajv-keywords/releases/tag/v5.0.0) 应当用于 [ajvv v8 (英语)](https://github.com/ajv-validator/ajv)。 。 。 .

[ajv 关键词 v3](https://github.com/ajv-validator/ajv-keywords/tree/v3) 应使用 [ajvv 第6页](https://github.com/ajv-validator/ajv/tree/v6)。 。 。 .

## 目录

-   [安装](https://npmcn.com/package/ajv-keywords/#readme-install)
-   [使用量](https://npmcn.com/package/ajv-keywords/#readme-usage)
-   [关键词](https://npmcn.com/package/ajv-keywords/#readme-keywords)
    -   [类型](https://npmcn.com/package/ajv-keywords/#readme-types)
        -   [类型](https://npmcn.com/package/ajv-keywords/#readme-typeof)
        -   [实例](https://npmcn.com/package/ajv-keywords/#readme-instanceof)\+ 键
    -   [数字关键词](https://npmcn.com/package/ajv-keywords/#readme-keywords-for-numbers)
        -   [范围与专属范围](https://npmcn.com/package/ajv-keywords/#readme-range-and-exclusiverange)
    -   [字符串关键字](https://npmcn.com/package/ajv-keywords/#readme-keywords-for-strings)
        -   [正则表达式](https://npmcn.com/package/ajv-keywords/#readme-regexp)
        -   [转换](https://npmcn.com/package/ajv-keywords/#readme-transform)\* 联合国
    -   [数组的关键字](https://npmcn.com/package/ajv-keywords/#readme-keywords-for-arrays)
        -   [独有的项目收益](https://npmcn.com/package/ajv-keywords/#readme-uniqueitemproperties)\+ 键
    -   [对象的关键字](https://npmcn.com/package/ajv-keywords/#readme-keywords-for-objects)
        -   [所需所有资源](https://npmcn.com/package/ajv-keywords/#readme-allrequired)
        -   [任何必需](https://npmcn.com/package/ajv-keywords/#readme-anyrequired)
        -   [必需](https://npmcn.com/package/ajv-keywords/#readme-onerequired)
        -   [需要的样式](https://npmcn.com/package/ajv-keywords/#readme-patternrequired)
        -   [禁止](https://npmcn.com/package/ajv-keywords/#readme-prohibited)
        -   [深产](https://npmcn.com/package/ajv-keywords/#readme-deepproperties)
        -   [深层要求](https://npmcn.com/package/ajv-keywords/#readme-deeprequired)
        -   [动态默认值](https://npmcn.com/package/ajv-keywords/#readme-dynamicdefaults)\* 联合国\+ 键
    -   [所有类型的关键词](https://npmcn.com/package/ajv-keywords/#readme-keywords-for-all-types)
        -   [选择/ 选择案件/ 选择默认](https://npmcn.com/package/ajv-keywords/#readme-selectselectcasesselectdefault)
-   [安全联络](https://npmcn.com/package/ajv-keywords/#readme-security-contact)
-   [开源软件支持](https://npmcn.com/package/ajv-keywords/#readme-open-source-software-support)
-   [许可证](https://npmcn.com/package/ajv-keywords/#readme-license)

\* 联合国 - 修改数据的关键词 \+ 键 - 不支持的关键词 [独立验证代码](https://github.com/ajv-validator/ajv/blob/master/docs/standalone.md)

## 安装

要安装版本 4 要使用 [Ajv v7 (英语)](https://github.com/ajv-validator/ajv)数字 :

```
npm install ajv-keywords
```

## 使用量

添加所有可用的关键字 :

```javascript
const Ajv = require("ajv")
const ajv = new Ajv()
require("ajv-keywords")(ajv)

ajv.validate({instanceof: "RegExp"}, /.*/) // true
ajv.validate({instanceof: "RegExp"}, ".*") // false
```

添加单一关键字 :

```javascript
require("ajv-keywords")(ajv, "instanceof")
```

要添加多个关键字 :

```javascript
require("ajv-keywords")(ajv, ["typeof", "instanceof"])
```

要直接添加单一关键字( 避免添加未使用的代码) :

```javascript
require("ajv-keywords/dist/keywords/select")(ajv, opts)
```

要通过 Ajv 选项添加所有关键字 :

```javascript
const ajv = new Ajv({keywords: require("ajv-keywords/dist/definitions")(opts)})
```

要通过选项添加一个或多个关键字:

```javascript
const ajv = new Ajv({
  keywords: [
    require("ajv-keywords/dist/definitions/typeof")(),
    require("ajv-keywords/dist/definitions/instanceof")(),
    // select exports an array of 3 definitions - see "select" in docs
    ...require("ajv-keywords/dist/definitions/select")(opts),
  ],
})
```

`opts` 是带有属性的可选对象 `defaultMeta` - meta-schema的URI,用于使用子chemas的关键词(`select` 财务报告和审定财务报表 `deepProperties`) (中文(简体) ). 默认是 `"http://json-schema.org/schema"`。 。 。 .

## 关键词

### 类型

#### `typeof`

基于 Java 脚本 `typeof` 操作.

关键词的值应为字符串(`"undefined"`, (中文(简体) ), `"string"`, (中文(简体) ), `"number"`, (中文(简体) ), `"object"`, (中文(简体) ), `"function"`, (中文(简体) ), `"boolean"` 或者说 `"symbol"`)或一系列字符串.

通过验证结果 `typeof` 值上的操作应该等于字符串(或数组中的字符串之一).

```javascript
ajv.validate({typeof: "undefined"}, undefined) // true
ajv.validate({typeof: "undefined"}, null) // false
ajv.validate({typeof: ["undefined", "object"]}, null) // true
```

#### `instanceof`

基于 Java 脚本 `instanceof` 操作.

关键词的值应为字符串(`"Object"`, (中文(简体) ), `"Array"`, (中文(简体) ), `"Function"`, (中文(简体) ), `"Number"`, (中文(简体) ), `"String"`, (中文(简体) ), `"Date"`, (中文(简体) ), `"RegExp"` 或者说 `"Promise"`)或一系列字符串.

通过验证结果 `data instanceof ...` 在数值上的操作应当为真 :

```javascript
ajv.validate({instanceof: "Array"}, []) // true
ajv.validate({instanceof: "Array"}, {}) // false
ajv.validate({instanceof: ["Array", "Function"]}, function () {}) // true
```

您可以添加您自己的构建器函数以通过此关键词识别 :

```javascript
class MyClass {}
const instanceofDef = require("ajv-keywords/dist/definitions/instanceof")
instanceofDef.CONSTRUCTORS.MyClass = MyClass
ajv.validate({instanceof: "MyClass"}, new MyClass()) // true
```

**请注意**: 当前 `instanceof` 不支持在 [独立验证代码](https://github.com/ajv-validator/ajv/blob/master/docs/standalone.md) - 必须作为 [`code` 关键词](https://github.com/ajv-validator/ajv/blob/master/docs/keywords.md#define-keyword-with-code-generation-function) 支持《公约》,欢迎加入.

### 数字关键词

#### `range` 财务报告和审定财务报表 `exclusiveRange`

最小和最大关键词组合的语法糖(或排他性最小和排他性Maximum),如果范围中没有数字,也失败了计划汇编.

这些关键词的值必须是由两个数字组成的数组,第二个必须大于或等于第一个数字.

如果验证值不是一个数字,则验证通过,否则,验证值应大于(或等于)第一个数字,并小于(或等于)数组中的第二个数字.

```javascript
const schema = {type: "number", range: [1, 3]}
ajv.validate(schema, 1) // true
ajv.validate(schema, 2) // true
ajv.validate(schema, 3) // true
ajv.validate(schema, 0.99) // false
ajv.validate(schema, 3.01) // false

const schema = {type: "number", exclusiveRange: [1, 3]}
ajv.validate(schema, 1.01) // true
ajv.validate(schema, 2) // true
ajv.validate(schema, 2.99) // true
ajv.validate(schema, 1) // false
ajv.validate(schema, 3) // false
```

### 字符串关键字

#### `regexp`

此关键词允许使用图案中带有旗帜的正则表达式, 也可以不使用 `"u"` 需要时的旗帜(标准) `pattern` 关键字不支持旗帜,并暗示存在 `"u"` 旗帜).

此关键字仅适用于字符串 。 如果数据不是字符串,则验证成功.

此关键字的值可以是字符串( 由 `regexp.toString()`)或带有属性的对象 `pattern` 财务报告和审定财务报表 `flags` (应该传递给 RegExp 构造器的相同字符串).

```javascript
const schema = {
  type: "object",
  properties: {
    foo: {type: "string", regexp: "/foo/i"},
    bar: {type: "string", regexp: {pattern: "bar", flags: "i"}},
  },
}

const validData = {
  foo: "Food",
  bar: "Barmen",
}

const invalidData = {
  foo: "fog",
  bar: "bad",
}
```

#### `transform`

此关键词允许在验证时修改字符串 .

此关键字仅适用于字符串 。 如果数据不是字符串,则 `transform` 关键字被忽略 .

一个独立的字符串不能被修改,即:. `data = 'a'; ajv.validate(schema, data);`,因为字符串是通过值传递的

**支持的转换 :**

-   `trim`: 删除起始和结尾的空白
-   `trimStart`编号 :`trimLeft`: 从开始去除空白
-   `trimEnd`编号 :`trimRight`: 从末尾去除空白
-   `toLowerCase`: 转换为小写
-   `toUpperCase`: 转换为大写
-   `toEnumCase`: 更改字符串大小写为等于其中之一 `enum` 计划中的数值

转换按所列顺序进行.

说明: `toEnumCase` 要求所有允许的值在大小写不敏感时是独一无二的.

**示例:多重转换**

```javascript
require("ajv-keywords")(ajv, "transform")

const schema = {
  type: "array",
  items: {
    type: "string",
    transform: ["trim", "toLowerCase"],
  },
}

const data = ["  MixCase  "]
ajv.validate(schema, data)
console.log(data) // ['mixcase']
```

**示例 `enumcase`**

```javascript
require("ajv-keywords")(ajv, ["transform"])

const schema = {
  type: "array",
  items: {
    type: "string",
    transform: ["trim", "toEnumCase"],
    enum: ["pH"],
  },
}

const data = ["ph", " Ph", "PH", "pH "]
ajv.validate(schema, data)
console.log(data) // ['pH','pH','pH','pH']
```

### 数组的关键字

#### `uniqueItemProperties`

关键词允许检查数组项中的某些属性是独一无二的 .

此关键字仅适用于数组 。 如果数据不是数组,则验证成功.

此关键字的值必须是一系列字符串 - 属性名称, 在所有项目中都有独特的值 .

```javascript
const schema = {
  type: "array",
  uniqueItemProperties: ["id", "name"],
}

const validData = [{id: 1}, {id: 2}, {id: 3}]

const invalidData1 = [
  {id: 1},
  {id: 1}, // duplicate "id"
  {id: 3},
]

const invalidData2 = [
  {id: 1, name: "taco"},
  {id: 2, name: "taco"}, // duplicate "name"
  {id: 3, name: "salsa"},
]
```

此关键字由下列人员提供: [@blainesch (英语)](https://github.com/blainesch)。 。 。 .

**请注意**: 当前 `uniqueItemProperties` 不支持在 [独立验证代码](https://github.com/ajv-validator/ajv/blob/master/docs/standalone.md) - 必须作为 [`code` 关键词](https://github.com/ajv-validator/ajv/blob/master/docs/keywords.md#define-keyword-with-code-generation-function) 支持《公约》,欢迎加入.

### 对象的关键字

#### `allRequired`

此关键词允许要求存在用于 `properties` 同一计划对象中的关键词 .

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

此关键字的值必须是布尔值 .

如果关键词的值是 `false`,验证成功.

如果关键词的值是 `true`,如果数据包含在 `properties` 关键词(在同一schema对象中).

如果 `properties` 关键词不在同一计划对象中存在,计划汇编会丢出例外.

```javascript
const schema = {
  type: "object",
  properties: {
    foo: {type: "number"},
    bar: {type: "number"},
  },
  allRequired: true,
}

const validData = {foo: 1, bar: 2}
const alsoValidData = {foo: 1, bar: 2, baz: 3}

const invalidDataList = [{}, {foo: 1}, {bar: 2}]
```

#### `anyRequired`

此关键字允许要求列表中存在任何(至少一个)属性 .

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

此关键字的值必须是字符串的数组,每个字符串都是属性名. 要使数据对象有效,该对象中至少应存在该数组中的一个属性.

```javascript
const schema = {
  type: "object",
  anyRequired: ["foo", "bar"],
}

const validData = {foo: 1}
const alsoValidData = {foo: 1, bar: 2}

const invalidDataList = [{}, {baz: 3}]
```

#### `oneRequired`

此关键字允许从列表中只要求有一个属性存在 .

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

此关键字的值必须是字符串的数组,每个字符串都是属性名. 要使数据对象完全有效,该数组中的属性之一应在对象中存在.

```javascript
const schema = {
  type: "object",
  oneRequired: ["foo", "bar"],
}

const validData = {foo: 1}
const alsoValidData = {bar: 2, baz: 3}

const invalidDataList = [{}, {baz: 3}, {foo: 1, bar: 2}]
```

#### `patternRequired`

此关键字允许要求存在符合某些模式的属性 .

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

此关键字的值应该是字符串的数组,每个字符串都是正则表达式. 要使数据对象在这个阵列中每个正则表达式有效,数据对象中至少应匹配一个属性名称.

如果数组包含多个正则表达式,则多个表达式可以匹配同一个属性名称.

```javascript
const schema = {
  type: "object",
  patternRequired: ["f.*o", "b.*r"],
}

const validData = {foo: 1, bar: 2}
const alsoValidData = {foobar: 3}

const invalidDataList = [{}, {foo: 1}, {bar: 2}]
```

#### `prohibited`

此关键词允许禁止将列表中的任何属性存在于对象中.

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

此关键字的值应该是字符串的数组,每个字符串都是属性名. 要使数据对象有效,该数组中的任何属性都不应出现在对象中.

```javascript
const schema = {
  type: "object",
  prohibited: ["foo", "bar"],
}

const validData = {baz: 1}
const alsoValidData = {}

const invalidDataList = [{foo: 1}, {bar: 2}, {foo: 1, bar: 2}]
```

**请注意**数字 : `{prohibited: ['foo', 'bar']}` 等同为 `{not: {anyRequired: ['foo', 'bar']}}` (即对任何数据具有相同的验证结果).

#### `deepProperties`

此关键词允许验证深层属性(由JSON指针识别).

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

值应为对象,其中键为JSON指向数据,从数据中当前位置开始,值为JSON schemas. 要使数据对象有效,每个JSON指针的值应根据相应的方案有效.

```javascript
const schema = {
  type: "object",
  deepProperties: {
    "/users/1/role": {enum: ["admin"]},
  },
}

const validData = {
  users: [
    {},
    {
      id: 123,
      role: "admin",
    },
  ],
}

const alsoValidData = {
  users: {
    1: {
      id: 123,
      role: "admin",
    },
  },
}

const invalidData = {
  users: [
    {},
    {
      id: 123,
      role: "user",
    },
  ],
}

const alsoInvalidData = {
  users: {
    1: {
      id: 123,
      role: "user",
    },
  },
}
```

#### `deepRequired`

此关键词允许检查一些深层属性( 由 JSON 指针识别) 可用 .

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

数值应该是JSON指向数据的数组,从数据中的当前位置开始. 要使数据对象有效,每个JSON指针应该是数据中已有的部分.

```javascript
const schema = {
  type: "object",
  deepRequired: ["/users/1/role"],
}

const validData = {
  users: [
    {},
    {
      id: 123,
      role: "admin",
    },
  ],
}

const invalidData = {
  users: [
    {},
    {
      id: 123,
    },
  ],
}
```

见 [json-schema-org/json-schema-spec#203 互联网档案馆的存檔,存档日期2013-12-22](https://github.com/json-schema-org/json-schema-spec/issues/203#issue-197211916) 例如,当一个图案没有 `deepRequired` 关键词.

### 所有类型的关键词

#### `select`编号 :`selectCases`编号 :`selectDefault`

**请注意**:这些关键词被贬值. 建议使用 OpenAPI [歧视者](https://ajv.js.org/json-schema.html#discriminator) 关键字由 Ajv v8 支持而不是 `select`。 。 。 .

这些关键词允许选择用于根据已验证数据中某些属性的价值验证数据的方案.

这些关键词必须在同一计划对象中存在(`selectDefault` 为可选的).

价值 `select` 关键词应为: [数据参考](https://github.com/ajv-validator/ajv/blob/master/docs/validation.md#data-reference) 指向被验证数据中的任何原始JSON类型(字符串、数字、布尔或无效)。 也可以使用原始类型的常数作为这个关键词的值(例如为调试目的).

价值 `selectCases` 关键字必须是对象,其中每个属性名称都可能是字符串表示值: `select` 关键词和每个属性值是一个相应的计划(从草案06可以是布尔语),必须用来验证数据.

价值 `selectDefault` 关键词是用于验证数据以防万一的 schema(也可以是布尔语) `selectCases` 没有键值等于 `select` 关键词.

鉴定在下列情形中成功: 1

-   使用选定的计划验证数据成功,
-   没有一个计划是用来验证的,
-   选择的值是未定义的(数据引用的数据中没有属性).

若为 `select` 值(在数据中)不是验证失败的原始类型.

此关键字正确跟踪被评价的属性和要与之合作的项目 `unevaluatedProperties` 财务报告和审定财务报表 `unevaluatedItems` 关键字 - 只使用子schema 中的属性和项目(其中之一) `selectCases` 子计划或 `selectDefault` 标记为 subschema) .

**请注意**: 这些关键字需要 Ajv `$data` 选项 [数据参考](https://github.com/ajv-validator/ajv/blob/master/docs/validation.md#data-reference)。 。 。 .

```javascript
require("ajv-keywords")(ajv, "select")

const schema = {
  type: "object",
  required: ["kind"],
  properties: {
    kind: {type: "string"},
  },
  select: {$data: "0/kind"},
  selectCases: {
    foo: {
      required: ["foo"],
      properties: {
        kind: {},
        foo: {type: "string"},
      },
      additionalProperties: false,
    },
    bar: {
      required: ["bar"],
      properties: {
        kind: {},
        bar: {type: "number"},
      },
      additionalProperties: false,
    },
  },
  selectDefault: {
    propertyNames: {
      not: {enum: ["foo", "bar"]},
    },
  },
}

const validDataList = [
  {kind: "foo", foo: "any"},
  {kind: "bar", bar: 1},
  {kind: "anything_else", not_bar_or_foo: "any value"},
]

const invalidDataList = [
  {kind: "foo"}, // no property foo
  {kind: "bar"}, // no property bar
  {kind: "foo", foo: "any", another: "any value"}, // additional property
  {kind: "bar", bar: 1, another: "any value"}, // additional property
  {kind: "anything_else", foo: "any"}, // property foo not allowed
  {kind: "anything_else", bar: 1}, // property bar not allowed
]
```

#### `dynamicDefaults`

此关键词允许为属性指定动态默认值,例如时间戳,独特的ID等.

此关键词只有在 `useDefaults` 选项被使用而不在内部 `anyOf` 关键词等,与 [ajv 处理的默认关键字](https://github.com/epoberezkin/ajv#assigning-defaults)。 。 。 .

应在对象级别上添加关键词。 其价值应为每个财产对应财产名称的对象,其方式与标准 `properties` 关键词 每个财产的价值可以是:

-   动态默认函数的标识符(字符串)
-   有属性的对象 `func` (标识)和 `args` (一个有参数的对象,将在计划汇编过程中传递到此函数 - 参见示例).

使用的属性 `dynamicDefaults` 不应添加到 `required` 同一方案的关键字( 或验证会失败) , 因为不同于 `default` 此关键字在验证后处理.

有几种预定义的动态默认函数:

-   `"timestamp"` - 以毫秒计的当前时间戳
-   `"datetime"` - 作为字符串的当前日期和时间(ISO,根据 `date-time` 格式)
-   `"date"` - 当前日期为字符串(ISO,根据 `date` 格式)
-   `"time"` - 当前时间作为字符串(ISO,根据 `time` 格式)
-   `"random"` - \[0, 1\] 间隔中的伪随机数
-   `"randomint"` - 假随机整数 如果字符串用作属性值,则函数会随机返回 0 或 1 。 如果对象 `{ func: 'randomint', args: { max: N } }` 然后使用默认值为 \[0, N\] 间隔中的整数.
-   `"seq"` - 从0开始的相继整数。 如果字符串用作属性值,则会使用默认序列. 如果对象 `{ func: 'seq', args: { name: 'foo'} }` 然后使用带有名称的序列 `"foo"` 将被使用。 序列是全球性的,即使使用不同的 ajv 例.

```javascript
const schema = {
  type: "object",
  dynamicDefaults: {
    ts: "datetime",
    r: {func: "randomint", args: {max: 100}},
    id: {func: "seq", args: {name: "id"}},
  },
  properties: {
    ts: {
      type: "string",
      format: "date-time",
    },
    r: {
      type: "integer",
      minimum: 0,
      exclusiveMaximum: 100,
    },
    id: {
      type: "integer",
      minimum: 0,
    },
  },
}

const data = {}
ajv.validate(data) // true
data // { ts: '2016-12-01T22:07:28.829Z', r: 25, id: 0 }

const data1 = {}
ajv.validate(data1) // true
data1 // { ts: '2016-12-01T22:07:29.832Z', r: 68, id: 1 }

ajv.validate(data1) // true
data1 // didn't change, as all properties were defined
```

使用时 `useDefaults` 选项值 `"empty"`,属性和物品等于 `null` 或者说 `""` (空字符串)将被视为缺失并指定默认值 。 使用 `allOf` [复合关键字](https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#compound-keywords) 要执行 `dynamicDefaults` 在验证之前.

```javascript
const schema = {
  type: "object",
  allOf: [
    {
      dynamicDefaults: {
        ts: "datetime",
        r: {func: "randomint", args: {min: 5, max: 100}},
        id: {func: "seq", args: {name: "id"}},
      },
    },
    {
      properties: {
        ts: {
          type: "string",
        },
        r: {
          type: "number",
          minimum: 5,
          exclusiveMaximum: 100,
        },
        id: {
          type: "integer",
          minimum: 0,
        },
      },
    },
  ],
}

const data = {ts: "", r: null}
ajv.validate(data) // true
data // { ts: '2016-12-01T22:07:28.829Z', r: 25, id: 0 }
```

您可以添加您自己的动态默认函数以通过此关键词识别 :

```javascript
const uuid = require("uuid")

const def = require("ajv-keywords/dist/definitions/dynamicDefaults")
def.DEFAULTS.uuid = () => uuid.v4

const schema = {
  dynamicDefaults: {id: "uuid"},
  properties: {id: {type: "string", format: "uuid"}},
}

const data = {}
ajv.validate(schema, data) // true
data // { id: 'a1183fbe-697b-4030-9bcc-cfeb282a9150' };

const data1 = {}
ajv.validate(schema, data1) // true
data1 // { id: '5b008de7-1669-467a-a5c6-70fa244d7209' }
```

您也可以定义接受参数的动态默认值,例如uuid的版本:

```javascript
const uuid = require("uuid")

function getUuid(args) {
  const version = "v" + ((arvs && args.v) || "4")
  return uuid[version]
}

const def = require("ajv-keywords/dist/definitions/dynamicDefaults")
def.DEFAULTS.uuid = getUuid

const schema = {
  dynamicDefaults: {
    id1: "uuid", // v4
    id2: {func: "uuid", v: 4}, // v4
    id3: {func: "uuid", v: 1}, // v1
  },
}
```

**请注意**: 动态默认函数按它们拥有的参数数加以区分(`function.length`) (中文(简体) ). 不期望默认的函数必须有一个非可选参数,这样 `function.length` > 0 个.

`dynamicDefaults` 不支持在 [独立验证代码](https://github.com/ajv-validator/ajv/blob/master/docs/standalone.md)。 。 。 .

## 安全联络

请使用 [电梯安全联络](https://tidelift.com/security)。 。 。 . Tidelift将协调固定和披露.

请不要通过 GitHub 问题报告安全漏洞 .

## 开源软件支持

Ajv 键词是 [收费](https://tidelift.com/subscription/pkg/npm-ajv-keywords?utm_source=npm-ajv-keywords&utm_medium=referral&utm_campaign=readme) - 除了软件维护者提供的支助外,它还向开源软件用户提供集中支持.

## 许可证

[麻省理工学院](https://github.com/epoberezkin/ajv-keywords/blob/master/LICENSE)

## 常见问题

### ajv-keywords 是什么？

Ajv JSON 验证器的附加 JSON- Schema 关键词

### 如何安装 ajv-keywords？

在项目目录运行 npm install ajv-keywords，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：ajv（^8\.8\.2）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### ajv-keywords 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### ajv-keywords 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### ajv-keywords 可以商用吗？

ajv-keywords 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### ajv-keywords 的下载量有多少？

根据 npm 官方下载统计，ajv-keywords 在 2026/10/05 – 2026/11/03 这 30 天内被下载 347,313,401 次，日均约 11,577,113 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### ajv-keywords 还在维护吗？

最新版本 5\.1\.0 发布于 2021/11/22（4 年前）；至今共发布 43 个版本，其中过去 12 个月发布了 0 个；首次发布于 2016/06/06。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

