≪ Today I learned. RSS購読
公開日
タグ
TypeScript
著者
ダーシノ(@bc_rikko)

TypeScript Decoratorを使ったメモ化

TypeScript 5.0で新しいDecoratorが追加された。

※今回追加されたものはECMAScriptの仕様に則ったもので、TypeScriptに前からあったDecoratorはLegacy Decoratorとして区別される

Decoratorでメモ化する

function memo(target: any, _context: ClassMethodDecoratorContext) {
  const memo = new Map<string, any>()

  function method (this: any, ...args: any[]) {
    const key = JSON.stringify(args)
    if (memo.has(key)) { return memo.get(key) }

    const result = target.call(this, ...args)
    memo.set(key, result)
    return result
  }
  return method
}


class Calculator {
  @memo
  calc(x: number, y: number) {
    // めちゃくちゃ重い計算処理
    return x + y
  }
}

const calclator = new Calculator()

// calc の処理がまるっと実行される
console.log(calclator.calc(1, 2))

// キャッシュされている値が返ってくるだけなので速い
console.log(calclator.calc(1, 2))