可实现强类型、可复用的缓存过滤层:泛型基类统一契约并保持返回类型,装饰器工厂自动推导类型、支持多级缓存与零改造接入,运行时校验+静默降级保障可靠性。

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

















