node.js - 如何内存 TypeScript getter

标签 node.js angular typescript

我正在使用以下方法来使用装饰器来内存 TypeScript getter,但想知道是否有更好的方法。我正在使用流行的memoizee从 npm 打包如下:

import { memoize } from '@app/decorators/memoize'

export class MyComponent {

  @memoize()
  private static memoizeEyeSrc(clickCount, maxEyeClickCount, botEyesDir) {
    return clickCount < maxEyeClickCount ? botEyesDir + '/bot-eye-tiny.png' : botEyesDir + '/bot-eye-black-tiny.png'
  }

  get leftEyeSrc() {
    return MyComponent.memoizeEyeSrc(this.eyes.left.clickCount, this.maxEyeClickCount, this.botEyesDir)
  }
}

并且 memoize 装饰器是:
// decorated method must be pure
import * as memoizee from 'memoizee'

export const memoize = (): MethodDecorator => {
  return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
    const func = descriptor.value
    descriptor.value = memoizee(func)
    return descriptor
  }
}

有没有办法在不使用 MyComponent 中的两个单独函数并将装饰器直接添加到 TypeScript getter 的情况下做到这一点?

这里的一个考虑因素是修饰函数必须是纯的(在这种情况下),但如果您的答案不满足这一点,请随意忽略这一点,因为我对如何解决这个问题很感兴趣。

最佳答案

可以扩展装饰器以支持原型(prototype)方法和 getter:

export const memoize = (): MethodDecorator => {
  return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
    if ('value' in descriptor) {
      const func = descriptor.value;
      descriptor.value = memoizee(func);
    } else if ('get' in descriptor) {
      const func = descriptor.get;
      descriptor.get = memoizee(func);
    }
    return descriptor;
  }
}

并直接在 getter 上使用:
  @memoize()
  get leftEyeSrc() {
    ...
  }

关于node.js - 如何内存 TypeScript getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56148490/

相关文章:

Angular 2 "Error encountered resolving symbol values statically."运行 i18n

javascript - 为什么这两种进行异步调用的方法(一种使用 Promise,另一种使用生成器)不会产生相同的结果?

linux - 从 NodeJs 和 npm 完全清理服务器

javascript - 具有相同选项的多个选择

angular - 何时在 Apollo-Angular 中使用 watchQuery 或查询?

typescript - 为什么 WebStorm 显示 TypeScript 类型错误?

angular - 无法读取 Angular2 Typescript 中未定义的属性 'value'

Typescript 从实现中推断通用类型

mongodb - 蒙戈 : multiple queries or not?

node.js - 延迟处理 Node 中传入的 HTTP 请求