无需装饰器时,缓存Getter的最优实现方案是什么?
Getter缓存的无装饰器实现方案
对Getter进行“缓存”指的是仅计算一次值,后续复用该值时无需重复计算。我正在寻找缓存Getter的最优方案——这里的“最优”要求语法简洁且具备TypeScript类型支持。虽然有不少库可以通过@cache这类装饰器实现该功能,但我不想使用装饰器。
以下是一种可行的实现方式:
type NoUndefined<T> = T extends undefined ? never : T; function isNoUndefined<T>(value: T): value is NoUndefined<T> { return typeof value !== 'undefined' } function handleGetter<T>(value:T, operation: () => NoUndefined<T>): NoUndefined<T> { if (isNoUndefined(value)) return value; return operation() } class CalendarDate extends Date { #day: number | undefined = undefined get day () { return this.#day = handleGetter(this.#day, () => { console.log('runs once') return this.getDate() }) } } const c = new CalendarDate() c.day c.day c.day c.day
实现说明
NoUndefined<T>:自定义类型工具,用于排除undefined类型,确保缓存返回值为有效类型isNoUndefined:类型守卫函数,帮助TypeScript判断值是否为非undefined,提供准确的类型推断handleGetter:核心工具函数,负责判断缓存值是否存在,存在则直接返回,不存在则执行计算逻辑并返回结果- 类中通过私有字段
#day存储缓存值,Getter调用handleGetter时将计算结果赋值给私有字段,实现“一次计算、多次复用”的缓存效果
内容的提问来源于stack exchange,提问作者ThomasReggi
相关产品推荐
相关产品推荐

