ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

es-toolkit/conformsTo 实战指南:用条件谓词对象校验数据结构(Lodash 兼容)

es-toolkit/conformsTo 实战指南:用条件谓词对象校验数据结构(Lodash 兼容) es-toolkit/conformsTo 实战指南用条件谓词对象校验数据结构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-toolkitconformsTo是 es-toolkit 的 Lodash 兼容层es-toolkit/compat提供的谓词工具函数用于检查一个对象的各个属性是否同时满足一组由条件函数谓词构成的校验规则。在表单校验、数据过滤、接口响应断言等场景中你可以用一段声明式的条件对象替代手写的多条件if判断让校验逻辑更集中、更易读。读完本文你将掌握conformsTo的完整用法、边界行为、类型签名以及它与conforms的关系并能在迁移 Lodash 代码时直接替换使用。一、conformsTo 是什么conformsTo(target, source)接收两个对象target是被检查的对象source是一个谓词对象——它的每个属性都是一个函数对应target中同名属性的校验条件。函数会逐个取出source的谓词并应用到target的对应属性值上只有全部谓词都返回真值时才返回true。const result conformsTo(target, source);该函数位于 conformsTo.ts实现与 conformsTo.md文档。它与 Lodash 的conformsTo行为 1:1 对齐兼容层整体通过了 Lodash 自身的测试套件详见 compat 模块说明。二、基本用法从es-toolkit/compat导入import { conformsTo } from es-toolkit/compat; // 基本用法所有条件都满足 const object { a: 1, b: 2 }; const conditions { a: n n 0, b: n n 1, }; conformsTo(object, conditions); // true所有条件都满足 // 多样的条件组合 const user { name: Alice, age: 25, active: true }; const userValidation { name: s typeof s string s.length 0, age: n typeof n number n 18, active: b typeof b boolean, }; conformsTo(user, userValidation); // true // 条件不满足时返回 false const invalidUser { name: , age: 15, active: yes }; conformsTo(invalidUser, userValidation); // false部分条件检查source里只写部分属性时只校验这些属性其余属性不参与判断const partialConditions { age: n n 21, }; conformsTo(user, partialConditions); // true只检查 age属性缺失即失败如果target缺少source中声明的某个属性直接返回falseconst incompleteObject { a: 1 }; // 没有 b 属性 const strictConditions { a: n n 0, b: n n 0, }; conformsTo(incompleteObject, strictConditions); // falseb 属性缺失参数与返回值项目说明targetRecordPropertyKey, any被检查的对象sourceRecordPropertyKey, (value: any) boolean每个属性对应一个条件函数返回值boolean所有条件满足返回true否则返回false三、深入源码实现原理与边界行为从源码结构看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 null直接返回true没有校验规则任何对象都符合。测试 conformsTo.spec.ts 验证了当source为[]、{}、null、undefined、false、0、NaN、等空值时均返回true。target null时只有空source才返回true若target为null/undefined且有非空规则必然失败空规则则通过。对应测试见 conformsTo.spec.ts。缺失属性判定value undefined !(key in target)这一行区分了属性值为undefined与属性根本不存在两种情况——属性不存在视为不通过返回false而属性存在但值为undefined时交给谓词自行判断。这是与 Lodash 行为对齐的关键细节。非函数谓词被跳过typeof predicate function的保护让source中混入非函数值如常量、空对象时不会抛错仅跳过该键的校验。因此即使source是函数对象函数本身也是对象可以挂属性也能工作相关用例见 conformsTo.spec.ts。只读取自有属性循环使用Object.keys(source)不包含继承属性。测试 conformsTo.spec.ts 验证了用类实例作source时原型链上的方法不会参与匹配。短路求值任一谓词返回假值立即返回false不继续执行剩余谓词。测试还特别验证了缺失属性的谓词根本不会被调用计数保持为 0见 conformsTo.spec.ts。类型签名ConformsPredicateObjectsource参数使用 ConformsPredicateObject.ts 定义的条件映射类型export type ConformsPredicateObjectT { [P in keyof T]: T[P] extends (arg: infer A) any ? A : any; };它按T的键逐个推断谓词参数类型让target与source的类型检查相互关联source中每个谓词的入参类型会自动取自target对应属性的类型。四、conformsTo 与 conforms柯里化兄弟conformsTo有一个柯里化版本conforms二者关系如同直接调用与部分应用。conforms(source)会返回一个新函数接受一个对象并返回是否符合规则import { conforms } from es-toolkit/compat; const isPositive (n: number) n 0; const isEven (n: number) n % 2 0; const conform conforms({ a: isPositive, b: isEven }); conform({ a: 2, b: 4 }); // true conform({ a: -1, b: 4 }); // false conform({ a: 2, b: 3 }); // falseconforms.ts 的实现非常简洁先用cloneDeep深拷贝一份source防止外部后续修改规则再返回一个内部调用conformsTo的闭包export function conformsT(source: ConformsPredicateObjectT): (value: T) boolean { source cloneDeep(source); return function (object: T) { return conformsTo(object, source); }; }这种返回判断函数的形态非常适合直接作为Array.prototype.filter的回调const objects [ { a: 1, b: 8 }, { a: 2, b: 4 }, { a: 3, b: 16 }, ]; objects.filter(conforms({ b: (v: number) v 4 })); // [{ a: 1, b: 8 }, { a: 3, b: 16 }]对应的过滤场景在 conformsTo.spec.ts 中也有完整验证。五、性能基准与 Lodash 的同台对比仓库在 conformsTo.bench.ts 中提供了es-toolkit/conformsTo与lodash/conformsTo的同参数基准测试使用 vitest bench 编写同一组{ a: 1, b: 2 }对象与两个谓词运行方式为# 在仓库根目录执行性能基准 yarn bench --benchmark conformsTo注基准脚本位于benchmarks/performance/具体运行命令请以仓库根目录 package.json 中的 scripts 为准。得益于上面展示的扁平循环与短路求值实现conformsTo没有任何额外对象分配相对 Lodash 具备更小的体积与更快的执行速度如需批量使用优先采用conforms预编译规则对象以复用闭包。六、迁移与使用建议conformsTo常用于以下场景表单/请求体校验用声明式条件对象代替散落各处的if组合数据过滤与conforms配合作为filter回调代码即规则从 Lodash 迁移es-toolkit/compat与 Lodash 接口 1:1 对齐直接把import { conformsTo } from lodash换成import { conformsTo } from es-toolkit/compat即可调用点无需改动。如果项目尚未使用 Lodash则更推荐直接使用es-toolkit主入口的类型安全版本兼容层的定位、迁移流程与设计原则详见 compat 模块说明。【免费下载链接】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),仅供参考
返回列表