对象计划包
概览
一个 JavaScript 对象合并/验证工具,在此可以定义每个密钥不同的合并和验证策略. 当您需要验证复杂数据结构,然后以比它更复杂的方式将其合并时,这样做很有帮助 Object.assign()。此选项用于 @eslint/config-array 软件包,但也可以单独使用.
安装
对于节点和相容运行时间:
npm install @eslint/object-schema
# or
yarn add @eslint/object-schema
# or
pnpm install @eslint/object-schema
# or
bun add @eslint/object-schema
对于德诺:
deno add @eslint/object-schema
使用量
导入 ObjectSchema 构造器 :
// 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。 。 。 .
例如:
const schema = new ObjectSchema({
name: {
merge: "replace",
validate() {},
},
});
命名验证策略
而不是指定一个 validate() 方法,您可以指定下列字符串之一来使用默认验证策略:
"array"- 值必须是数组."boolean"- 值必须是一个布尔."number"- 值必须是数字."object"- 值必须是非正数对象,包括数组和非正数对象."object?"- 值必须是对象或无效的,包括数组和非平面对象."string"- 值必须是字符串."string!"- 值必须是非空字符串.
例如:
const schema = new ObjectSchema({
name: {
merge: "replace",
validate: "string",
},
});
内建战略班
软件包还将内置的合并和验证策略导出为两个类,采用静态方法:
MergeStrategy- 内置合并功能(assign, (中文(简体) ),overwrite, (中文(简体) ),replace) (中文(简体) ).ValidationStrategy- 内置验证功能(array, (中文(简体) ),boolean, (中文(简体) ),number, (中文(简体) ),object, (中文(简体) ),object?, (中文(简体) ),string, (中文(简体) ),string!) (中文(简体) ).
这些策略与您按名称指定策略时所使用的策略相同( 例如, merge: "replace") (中文(简体) ). 如果您偏好通过一个函数而不是字符串, 您可以直接引用函数 :
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 包含图案定义的属性,例如:
const schema = new ObjectSchema({
name: {
schema: {
first: {
merge: "replace",
validate: "string",
},
last: {
merge: "replace",
validate: "string",
},
},
},
});
schema.validate({
name: {
first: "n",
last: "z",
},
});
合并时删除密钥
如果密钥返回的合并策略 undefined,则键将不会在最终对象中出现。 例如:
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 属性以指定任何密钥需要的一组其他属性。 例如:
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的持续维护与发展. 成为发起人 让你的标志在我们的读取器和 网站。 。 。 .



