# @eslint/object-schema 中文文档

规范地址：https://npmcn.com/package/%40eslint/object-schema/

版本：3\.0\.5
npm 元数据更新时间：2026-04-08T09:22:34.861Z
中文译文更新时间：2026-11-05T14:48:03.461Z
软件包许可：Apache-2\.0

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

原始 npm 页面：https://www.npmjs.com/package/%40eslint/object-schema
原文对照：https://npmcn.com/package/%40eslint/object-schema/?lang=original
项目主页：https://github.com/eslint/rewrite/tree/main/packages/object-schema#readme
源码仓库：https://github.com/eslint/rewrite

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

- 包体积（解压后）：67.1 kB，10 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- Node.js 要求：^20\.19\.0 \|\| ^22\.13\.0 \|\| \>=24
- 运行依赖：0 个
- 首次发布：2024-05-30T20:40:22.953Z
- 最新版本发布：2026-04-08T09:22:34.549Z
- 近 30 天下载量：511789461（2026-10-07 至 2026-11-05，npm 官方下载统计）
- 已发布版本数：11（近 12 个月 6 个）

## 中文简介

对象计划合并/验证器

## 安装

```sh
npm install @eslint/object-schema
```

也可以使用：`pnpm add @eslint/object-schema`、`yarn add @eslint/object-schema`、`bun add @eslint/object-schema`

## README

# 对象计划包

## 概览

一个 JavaScript 对象合并/验证工具,在此可以定义每个密钥不同的合并和验证策略. 当您需要验证复杂数据结构,然后以比它更复杂的方式将其合并时,这样做很有帮助 `Object.assign()`。此选项用于 [`@eslint/config-array`](https://npmjs.com/package/@eslint/config-array) 软件包,但也可以单独使用.

## 安装

对于节点和相容运行时间:

```shell
npm install @eslint/object-schema
# or
yarn add @eslint/object-schema
# or
pnpm install @eslint/object-schema
# or
bun add @eslint/object-schema
```

对于德诺:

```shell
deno add @eslint/object-schema
```

## 使用量

导入 `ObjectSchema` 构造器 :

```js
// using ESM
import { ObjectSchema } from "@eslint/object-schema";

// using CommonJS
const { ObjectSchema } = require("@eslint/object-schema");

const schema = new ObjectSchema({
    // define a definition for the "downloads" key
    downloads: {
        required: true,
        merge(value1 = 0, value2) {
            return value1 + value2;
        },
        validate(value) {
            if (typeof value !== "number") {
                throw new Error("Expected downloads to be a number.");
            }
        },
    },

    // define a strategy for the "versions" key
    versions: {
        required: true,
        merge(value1 = [], value2) {
            return value1.concat(value2);
        },
        validate(value) {
            if (!Array.isArray(value)) {
                throw new Error("Expected versions to be an array.");
            }
        },
    },
});

const record1 = {
    downloads: 25,
    versions: ["v1.0.0", "v1.1.0", "v1.2.0"],
};

const record2 = {
    downloads: 125,
    versions: ["v2.0.0", "v2.1.0", "v3.0.0"],
};

// make sure the records are valid
schema.validate(record1);
schema.validate(record2);

// merge together (schema.merge() accepts any number of objects)
const result = schema.merge(record1, record2);

// result looks like this:
// {
// 	downloads: 150,
// 	versions: ["v1.0.0", "v1.1.0", "v1.2.0", "v2.0.0", "v2.1.0", "v3.0.0"],
// }
```

## 提示和诡计

### 命名合并策略

而不是指定一个 `merge()` 方法,您可以指定以下字符串之一来使用默认合并策略:

-   `"assign"` - 使用时 `Object.assign()` 将两个值合并为一个对象.
-   `"overwrite"` - 第二个值总是取代第一个值.
-   `"replace"` - 如果第二个值不是第一个,第二个值将替换第一个值 `undefined`。 。 。 .

例如:

```js
const schema = new ObjectSchema({
    name: {
        merge: "replace",
        validate() {},
    },
});
```

### 命名验证策略

而不是指定一个 `validate()` 方法,您可以指定下列字符串之一来使用默认验证策略:

-   `"array"` - 值必须是数组.
-   `"boolean"` - 值必须是一个布尔.
-   `"number"` - 值必须是数字.
-   `"object"` - 值必须是非正数对象,包括数组和非正数对象.
-   `"object?"` - 值必须是对象或无效的,包括数组和非平面对象.
-   `"string"` - 值必须是字符串.
-   `"string!"` - 值必须是非空字符串.

例如:

```js
const schema = new ObjectSchema({
    name: {
        merge: "replace",
        validate: "string",
    },
});
```

### 内建战略班

软件包还将内置的合并和验证策略导出为两个类,采用静态方法:

-   `MergeStrategy` - 内置合并功能(`assign`, (中文(简体) ), `overwrite`, (中文(简体) ), `replace`) (中文(简体) ).
-   `ValidationStrategy` - 内置验证功能(`array`, (中文(简体) ), `boolean`, (中文(简体) ), `number`, (中文(简体) ), `object`, (中文(简体) ), `object?`, (中文(简体) ), `string`, (中文(简体) ), `string!`) (中文(简体) ).

这些策略与您按名称指定策略时所使用的策略相同( 例如, `merge: "replace"`) (中文(简体) ). 如果您偏好通过一个函数而不是字符串, 您可以直接引用函数 :

```js
import {
    ObjectSchema,
    MergeStrategy,
    ValidationStrategy,
} from "@eslint/object-schema";

const schema = new ObjectSchema({
    name: {
        required: true,
        merge: MergeStrategy.replace,
        validate: ValidationStrategy["string!"],
    },
    options: {
        required: false,
        merge: MergeStrategy.assign,
        validate: ValidationStrategy["object?"],
    },
});
```

注:因为 `object?` 财务报告和审定财务报表 `string!` 不是有效的标识符, 您必须使用括号标记访问它们( 例如 , `ValidationStrategy["object?"]`) (中文(简体) ).

### 子计划

如果您正在定义一个键, 它本身, 一个对象, 您可以使用 subschema 来简化进程 。 而不是定义 `merge()` 财务报告和审定财务报表 `validate()`,设置 `schema` 包含图案定义的属性,例如:

```js
const schema = new ObjectSchema({
    name: {
        schema: {
            first: {
                merge: "replace",
                validate: "string",
            },
            last: {
                merge: "replace",
                validate: "string",
            },
        },
    },
});

schema.validate({
    name: {
        first: "n",
        last: "z",
    },
});
```

### 合并时删除密钥

如果密钥返回的合并策略 `undefined`,则键将不会在最终对象中出现。 例如:

```js
const schema = new ObjectSchema({
    date: {
        merge() {
            return undefined;
        },
        validate(value) {
            if (isNaN(Date.parse(value))) {
                throw new Error("Invalid date.");
            }
        },
    },
});

const object1 = { date: "5/5/2005" };
const object2 = { date: "6/6/2006" };

const result = schema.merge(object1, object2);

console.log("date" in result); // false
```

### 需要另一个要显示的密钥

如果你希望有一把钥匙 需要另一把钥匙,你可以使用 `requires` 属性以指定任何密钥需要的一组其他属性。 例如:

```js
const schema = new ObjectSchema({
    date: {
        merge() {
            return undefined;
        },
        validate(value) {
            if (isNaN(Date.parse(value))) {
                throw new Error("Invalid date.");
            }
        },
    },
    time: {
        requires: ["date"],
        merge(first, second) {
            return second;
        },
        validate(value) {
            // ...
        },
    },
});

// throws error: Key "time" requires keys "date".
schema.validate({
    time: "13:45",
});
```

在这个例子中,尽管 `date` 是一个可选的密钥,它需要随时在场 `time` 已存在.

## 许可证

Apache 2.0 (英语)

## 发起人

以下公司,组织,个人支持ESLint的持续维护与发展. [成为发起人](https://eslint.org/donate) 让你的标志在我们的读取器和 [网站](https://eslint.org/sponsors)。 。 。 .

### 白金赞助商

[![Automattic](https://images.opencollective.com/automattic/d0ef3e1/logo.png)](https://automattic.com/)

### 黄金赞助商

[![Qlty Software](https://images.opencollective.com/qltysh/33d157d/logo.png)](https://qlty.sh/)

### 白银赞助商

[![Vite](https://images.opencollective.com/vite/d472863/logo.png)](https://vite.dev/) [![Liftoff](https://images.opencollective.com/liftoff/2d6c3b6/logo.png)](https://liftoff.io/) [![StackBlitz](https://avatars.githubusercontent.com/u/28635252)](https://stackblitz.com/)

### 青铜赞助商

[![Cybozu](https://images.opencollective.com/cybozu/933e46d/logo.png)](https://cybozu.co.jp/) [![SAP](https://avatars.githubusercontent.com/u/2531208)](https://opensource.sap.com/) [![CrawlJobs](https://images.opencollective.com/crawljobs-poland/fa43a17/logo.png)](https://www.crawljobs.com/) [![aeriusventilation's Org](https://images.opencollective.com/aeriusventilations-org/avatar.png)](https://npmcn.com/package/%40eslint/object-schema/#) [![Depot](https://images.opencollective.com/depot/39125a1/logo.png)](https://depot.dev/) [![Icons8](https://images.opencollective.com/icons8/7fa1641/logo.png)](https://icons8.com/) [![Discord](https://images.opencollective.com/discordapp/f9645d9/logo.png)](https://discord.com/) [![GitBook](https://avatars.githubusercontent.com/u/7111340)](https://www.gitbook.com/) [![HeroCoders](https://avatars.githubusercontent.com/u/37549774)](https://herocoders.com/) [![TestMu AI Open Source Office (Formerly LambdaTest)](https://avatars.githubusercontent.com/u/171592363)](https://www.lambdatest.com/)

### 技术赞助商

技术赞助者允许我们免费利用其产品和服务,作为对开放源生态系统和我们工作的贡献的一部分.

[![Netlify](https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/netlify-icon.svg)](https://netlify.com/) [![Algolia](https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/algolia-icon.svg)](https://algolia.com/) [![1Password](https://raw.githubusercontent.com/eslint/eslint.org/main/src/assets/images/techsponsors/1password-icon.svg)](https://1password.com/)

## 常见问题

### @eslint/object-schema 是什么？

对象计划合并/验证器

### 如何安装 @eslint/object-schema？

在项目目录运行 npm install @eslint/object-schema，或使用 pnpm add / yarn add / bun add。

### @eslint/object-schema 支持 TypeScript 吗？

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

### @eslint/object-schema 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @eslint/object-schema 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js ^20\.19\.0 \|\| ^22\.13\.0 \|\| \>=24。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @eslint/object-schema 可以商用吗？

@eslint/object-schema 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @eslint/object-schema 的下载量有多少？

根据 npm 官方下载统计，@eslint/object-schema 在 2026/10/07 – 2026/11/05 这 30 天内被下载 511,789,461 次，日均约 17,059,649 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @eslint/object-schema 还在维护吗？

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

