)
es-toolkit 的conforms用条件函数对象批量校验多个属性Lodash 兼容实现【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit导读conforms是 es-toolkit 的 Lodash 兼容模块es-toolkit/compat提供的工具函数它接收一个以属性名为键、以条件函数为值的对象返回一个新的校验函数用于判断后续传入的对象是否同时满足其中全部条件。当需要在数组过滤、表单校验、权限判断等场景中对多个属性做一次性批量校验时conforms可以把零散的条件封装成可复用的验证器。读完本文你将掌握conforms的完整用法、参数与返回值约定并能透过源码理解其与conformsTo的关系以及各项边界行为。什么是conforms在很多业务场景中我们需要同时检查一个对象的多个属性是否满足各自的条件。例如判断一个用户是否成年且高分、一条数据是否正数且偶数等。如果逐个if判断代码会变得冗长且难以复用。conforms将一组条件预编译为一个验证函数之后可以对任意对象反复调用const checker conforms(predicates);该 API 与 Lodash 的conforms保持兼容在 es-toolkit 中通过es-toolkit/compat子路径导入导出位置见 src/compat/compat.tsimport { conforms } from es-toolkit/compat;基本用法conforms(source)当你需要一次性检查多个属性时使用conforms。它生成一个验证函数方便之后对多个对象进行批量检查。import { conforms } from es-toolkit/compat; // 定义条件函数 const isPositive n n 0; const isEven n n % 2 0; const isString s typeof s string; // 创建包含多个条件的验证函数 const validator conforms({ a: isPositive, b: isEven, c: isString, }); // 验证对象 validator({ a: 2, b: 4, c: hello }); // true满足所有条件 validator({ a: -1, b: 4, c: hello }); // falsea 不是正数 validator({ a: 2, b: 3, c: hello }); // falseb 不是偶数 validator({ a: 2, b: 4, c: 123 }); // falsec 不是字符串在数组过滤中的典型场景conforms返回的验证函数签名与Array.prototype.filter的回调完全匹配因此可以像 Lodash 一样直接作为过滤条件使用const users [ { age: 25, score: 80, name: Alice }, { age: 17, score: 95, name: Bob }, { age: 30, score: 75, name: Charlie }, ]; const adultHighScorer conforms({ age: n n 18, score: n n 80, }); const filteredUsers users.filter(adultHighScorer); // [{ age: 25, score: 80, name: Alice }]参数sourceRecordPropertyKey, (value: any) boolean以各属性名为键、以对应条件函数为值的对象。每个条件函数接收被检查对象上对应属性的值返回布尔值或 truthy/falsy 值。返回值(object: RecordPropertyKey, any) boolean返回一个新函数调用它时传入待检查对象若该对象满足source中定义的全部条件则返回true否则返回false。源码实现conforms是conformsTo的偏应用conforms的实现非常简洁它本质上是把source参数预绑定到conformsTo上。完整实现位于 src/compat/predicate/conforms.tsexport function conformsT(source: ConformsPredicateObjectT): (value: T) boolean { source cloneDeep(source); return function (object: T) { return conformsTo(object, source); }; }这里有三个值得注意的实现细节调用cloneDeep深拷贝source验证函数生成后即使外部修改了原始source对象的条件函数也不会影响已生成的验证器。这一点在测试 src/compat/predicate/conforms.spec.ts 中有专门验证生成验证器后把source.a从value 1改为value 2验证器行为保持不变。返回闭包每次调用conforms都会创建一个独立的验证函数内部持有深拷贝后的条件对象。类型安全入参类型使用内部类型ConformsPredicateObjectT定义见 src/compat/_internal/ConformsPredicateObject.ts它会根据条件函数的参数类型自动推导被检查对象的属性类型。底层检查逻辑conformsToconformsTo是真正执行校验的函数位于 src/compat/predicate/conformsTo.ts核心逻辑如下export function conformsToT(target: T, source: ConformsPredicateObjectT): boolean { if (source null) { return true; } if (target null) { return Object.keys(source).length 0; } const keys Object.keys(source) as Arraykeyof T; for (let i 0; i keys.length; i) { const key keys[i]; const predicate source[key]; const value target[key]; if (value undefined !(key in (target as any))) { return false; } if (typeof predicate function !predicate(value)) { return false; } } return true; }逐条解读其检查规则仅遍历source的自身可枚举键Object.keys因此source原型链上继承的条件不会被使用——测试 conforms.spec.ts 验证了这一点只检查source中声明的属性target上多出的其他属性不影响结果缺失属性直接判负若目标对象上不存在source声明的键value undefined且key in target为假直接返回false且不会调用对应的条件函数。测试 conforms.spec.ts 用计数器验证了缺失属性时条件函数调用次数为 0条件函数非函数时跳过typeof predicate function的检查保证非函数值如undefined、普通数据不会引发调用错误短路返回任一条件不满足立即返回false全部通过才返回true。边界行为与空值语义conforms遵循 Lodash 兼容的边界语义这些行为都有对应的测试用例佐证目标对象为null/undefined返回false前提是source非空。见 conforms.spec.ts。其依据在conformsTo中target null时仅当source为空对象才返回true。source为空对象{}无论目标对象是什么包括null、undefined、[]、false、0、NaN、等都返回true——因为没有任何条件需要满足。见 conforms.spec.ts。目标对象是函数conforms可以检查函数对象自身的属性如Foo.a见 conforms.spec.ts。source本身是函数同样合法会读取函数对象上的属性作为条件见 conforms.spec.ts。非纯对象类实例作为目标对象时其原型链上的属性可以被条件命中见 conforms.spec.ts。与conformsTo的关系与选型建议conforms和conformsTo是一对互补 API二者都从es-toolkit/compat导出见 src/compat/compat.tsconformsTo(object, source)一次性调用直接传入目标对象和条件对象返回布尔值conforms(source)预绑定条件对象返回可复用的验证函数。源码注释明确说明The created function is equivalent toconformsTowith source partially applied生成的函数等价于把source偏应用后的conformsTo。选型建议只需检查一次 → 直接使用conformsTo(object, source)省去闭包开销需要反复检查多个对象如filter、every、循环校验→ 使用conforms预先生成验证器语义更清晰、可读性更好还能借助深拷贝避免外部修改条件对象带来的副作用。与其他断言型工具的配合在 es-toolkit 的 predicate 家族中conforms属于对象整体断言这一类与它定位相近的工具包括matches或isMatch按键值相等的模式匹配对象conformsTo一次性对象条件断言isSubset判断集合包含关系。与值相等的匹配不同conforms检查的是值满足条件因此更适合表达范围、类型、格式等动态约束例如age 18、typeof name string这类无法用字面量表达的条件。将conforms与filter、every、some等函数组合即可构建出声明式的批量校验流水线。总结conforms是 es-toolkit 兼容 Lodash API 中一个轻量而实用的断言工具以条件函数对象为输入返回可复用的验证函数底层由conformsTo提供逐属性、短路式的检查逻辑并通过cloneDeep保证验证器不受外部条件对象后续修改的影响。配合 src/compat/predicate/conforms.ts、src/compat/predicate/conformsTo.ts 与 src/compat/predicate/conforms.spec.ts 中的测试用例你可以完整确认其各项边界语义放心在过滤、校验等场景中使用。【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考