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