es-toolkit isWeakSet 完全指南:兼容 lodash 的 WeakSet 类型守卫与弱引用实践
es-toolkit isWeakSet 完全指南兼容 lodash 的 WeakSet 类型守卫与弱引用实践【免费下载链接】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-toolkitisWeakSet是 es-toolkit 兼容层es-toolkit/compat提供的 Lodash 兼容类型检查函数用于在 TypeScript 中类型安全地判断一个值是否为WeakSet并可作为类型守卫type guard收窄类型。本指南以 isWeakSet 官方参考文档 为主线结合仓库源码与测试用例帮助你掌握其用法、与Set/WeakMap等相似集合的区分技巧以及在 DOM 元素追踪、防内存泄漏等场景中的实战方案。提示该函数属于es-toolkit/compat兼容层。compat层的设计目标是与 lodash 保持 100% 行为对齐作为 lodash 的即插即用替代品详见 compat 入口说明。对于这种简单的类型判断官方文档明确建议直接使用更简洁、更现代的value instanceof WeakSet即可除非你需要与 lodash 代码库保持行为一致。isWeakSet 是什么isWeakSet(value)用于检测传入值是否为WeakSet实例返回true或false。它的 TypeScript 签名是类型守卫const result isWeakSet(value);从源码看兼容层实现非常轻量本质上是将判断委托给核心库的同名函数兼容层实现export function isWeakSet(value?: any): value is WeakSetobject { return isWeakSetToolkit(value); }而核心实现核心实现就是一行基于instanceof的判断export function isWeakSet(value: unknown): value is WeakSetWeakKey { return value instanceof WeakSet; }由此可以推断兼容层返回值类型收窄为WeakSetobject核心库收窄为WeakSetWeakKey两者都保证判断为true时调用方可以在后续代码中安全访问 WeakSet 的 API判断不依赖Object.prototype.toString标签或鸭子类型探测只认WeakSet这个内建构造函数的实例因此跨 realm如 iframe场景下的行为与原生instanceof一致。快速上手基础用法从es-toolkit/compat导入并在任意值上调用import { isWeakSet } from es-toolkit/compat; // WeakSet checking const weakSet new WeakSet(); isWeakSet(weakSet); // true // Other types return false isWeakSet(new Set()); // false isWeakSet(new Map()); // false isWeakSet(new WeakMap()); // false isWeakSet([]); // false isWeakSet({}); // false isWeakSet(weakset); // false isWeakSet(123); // false isWeakSet(null); // false isWeakSet(undefined); // false参数与返回值valueunknown要检测是否为 WeakSet 的值。返回value is WeakSetobject若值为 WeakSet 返回true否则返回false。由于返回值是类型谓词在if分支内value会被自动收窄为WeakSetobject无需手动断言。与相似集合的区分WeakSet 与Set、WeakMap、数组在形态上容易混淆同为集合类容器且Set与WeakSet方法名高度重叠。isWeakSet可以精确区分它们import { isWeakSet } from es-toolkit/compat; // WeakSet vs Set const obj {}; const weakSet new WeakSet([obj]); const set new Set([obj]); isWeakSet(weakSet); // true isWeakSet(set); // false // WeakSet vs WeakMap isWeakSet(new WeakSet()); // true isWeakSet(new WeakMap()); // false // WeakSet vs array isWeakSet(new WeakSet()); // true isWeakSet([]); // false该行为在兼容层测试兼容层测试中被系统性地验证除了new WeakSet()返回true外arguments对象、数组、布尔值、日期、Error、类数组切片、普通对象、数字、正则、字符串、Set、Symbol 等全部返回false甚至连空值falsey 值集合和无参数调用也一律返回false。实战一利用 WeakSet 的特殊性质做弱引用存储WeakSet 只能存放对象且对元素持有弱引用。借助isWeakSet的类型守卫可以在接收unknown参数的通用函数中安全地使用这些特性import { isWeakSet } from es-toolkit/compat; function addWeakReference(collection: unknown, item: object) { if (isWeakSet(collection)) { // WeakSet can only store objects and maintains weak references collection.add(item); console.log(Stored with weak reference in WeakSet); // WeakSet has no size information and cannot be iterated console.log(WeakSet has no size information and cannot be iterated); } else { console.log(Not a WeakSet); } } const weakSet new WeakSet(); const regularSet new Set(); const obj { id: 1 }; addWeakReference(weakSet, obj); // Stored with weak reference in WeakSet addWeakReference(regularSet, obj); // Not a WeakSet注意代码中的注释点出了 WeakSet 与 Set 的关键差异WeakSet 不暴露size属性、也不可迭代没有keys()/values()等迭代方法这是弱引用语义的必然结果——GC 随时可能回收元素集合无法给出稳定的数量与顺序。实战二DOM 元素追踪防止内存泄漏WeakSet 最经典的工程用途是标记/追踪对象但不阻止其被垃圾回收。官方文档给出了追踪 DOM 元素的示例当 DOM 元素从页面移除后若没有其他强引用它会自动从 WeakSet 中消失无需手动清理从而避免内存泄漏import { isWeakSet } from es-toolkit/compat; // DOM element tracking example function trackDOMElement(tracker: unknown, element: Element) { if (isWeakSet(tracker)) { // When DOM elements are removed, theyre automatically removed from WeakSet tracker.add(element); console.log(Started tracking DOM element); // Check tracking status later if (tracker.has(element)) { console.log(This element is being tracked); } } }isWeakSet在这里的价值是当tracker参数类型为unknown例如来自配置项、插件系统或动态数据时类型守卫让tracker.add()与tracker.has()得以通过类型检查同时保证运行时不会在传入普通Set或对象时误调用不存在的 API。为什么文档建议优先用 instanceof官方文档在开头给出了醒目的 warningisWeakSet虽然是 lodash 兼容函数但它只是一个简单的类型检查推荐直接使用value instanceof WeakSet。原因非常直白语义等价核心实现 isWeakSet 就是value instanceof WeakSet两者判断结果完全一致零开销少一次函数调用与导入类型安全TypeScript 对instanceof本身就提供类型收窄支持与类型守卫效果相同。因此只有当你正在迁移或维护基于 lodash 的代码、需要保持与 lodash 完全一致的行为时才推荐使用isWeakSet兼容层由 compat.ts 统一导出。配套资源参考文档isWeakSet (Lodash Compatibility)兼容层实现src/compat/predicate/isWeakSet.ts核心实现src/predicate/isWeakSet.ts兼容层测试src/compat/predicate/isWeakSet.spec.ts核心测试src/predicate/isWeakSet.spec.ts兼容层导出入口src/compat/compat.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),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →