You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需装饰器时,缓存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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:45:34