我正在使用以下方法来使用装饰器来内存 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/