跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何通过泛型类与装饰器模式巧妙融合实战在不改变既有业务逻辑下动态增加强类型的缓存过滤层

可实现强类型、可复用的缓存过滤层:泛型基类统一契约并保持返回类型,装饰器工厂自动推导类型、支持多级缓存与零改造接入,运行时校验+静默降级保障可靠性。 可以在不侵入原有业务逻辑的前提下,用泛型类封装缓存策略,再用装饰器声明式挂载到方法上,实现强类型、可复用的缓存过滤层。 泛型缓存基类统一数据契约 定义一个泛型抽象类,约束缓存键生成、过期策略和序列化行为,同时保持返回类型与业务方法一致: 使用 T 捕获业务方法的返回类型,确保缓存读写全程类型不丢失 通过 keyOf 或自定义 keyBuilder 函数,支持按参数组合动态生成强类型缓存键(如
getUserById:123
) 内置
serialize
/
deserialize
方法,默认使用 JSON,但允许子类覆盖以支持 Date、Map 等复杂类型 装饰器工厂注入缓存行为 编写一个可配置的装饰器工厂函数,接收缓存策略参数(如 TTL、storage 类型),返回具体装饰器: 装饰器内部调用泛型缓存实例的
getOrCompute
方法,自动处理「查缓存 → 未命中则执行原方法 → 写缓存」流程 利用 TypeScript 的类型推导能力,装饰器无需显式声明泛型参数 —— 它会从被装饰方法的签名中自动提取 T 支持多级缓存:先查内存 Map,再查 IndexedDB,失败后才触发网络请求 零改造接入已有服务方法 对已有 Service 类的方法直接添加装饰器,不修改函数体、不重写调用方代码: 例如在
UserService.fetchUser(id: string): Promise
上加
@Cached({ ttl: 60_000 })
编译后,该方法仍保持
Promise
类型,IDE 能正确提示
user.name
,无 any 泄漏 缓存键自动为
"fetchUser:string:abc123"
,类型安全且可追溯 运行时类型守卫与错误降级 在缓存读取环节加入轻量级类型校验,避免脏数据导致运行时崩溃: 反序列化后用
isUser(obj)
类型谓词做快速校验,不匹配则跳过缓存,回源执行 网络异常或缓存损坏时,装饰器静默降级,保证业务逻辑 100% 可达 所有缓存操作日志携带泛型类型名(如
[Cache] hit
),便于监控排查

相关文章