Adding Memoize v1
This commit is contained in:
@@ -1,2 +1,3 @@
|
|||||||
export * from './exclude';
|
export * from './exclude';
|
||||||
|
export * from './memoize';
|
||||||
export * from './pluck';
|
export * from './pluck';
|
||||||
19
src/decorators/memoize.ts
Normal file
19
src/decorators/memoize.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
export function Memoize(): Function {
|
||||||
|
return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
|
||||||
|
const originalMethod = descriptor.value;
|
||||||
|
descriptor.value = function(this: any, ...args: any[]) {
|
||||||
|
const reflectKey = `${JSON.stringify(this)}_${JSON.stringify(args)}_${propertyKey}`;
|
||||||
|
const hasReflectData = Reflect.hasMetadata(reflectKey, target);
|
||||||
|
|
||||||
|
if (hasReflectData) {
|
||||||
|
return Reflect.getMetadata(reflectKey, target)
|
||||||
|
} else {
|
||||||
|
const result = originalMethod.apply(this, args);
|
||||||
|
Reflect.defineMetadata(reflectKey, result, target);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return descriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
1
src/index.ts
Normal file
1
src/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
import "reflect-metadata";
|
||||||
22
tests/decorators/memoize.spec.ts
Normal file
22
tests/decorators/memoize.spec.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import 'reflect-metadata';
|
||||||
|
import { Serde } from "src/serde";
|
||||||
|
import { Memoize } from 'src/decorators';
|
||||||
|
|
||||||
|
class MemoizeTestModel extends Serde<MemoizeTestModel> {
|
||||||
|
name: string;
|
||||||
|
@Memoize() doNameRandom(): string {
|
||||||
|
return this.name + (Math.random() * 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('@Memoize() Decorator', () => {
|
||||||
|
it('should remember...', () => {
|
||||||
|
const testModel = new MemoizeTestModel().deserialize({
|
||||||
|
name: 'test model',
|
||||||
|
});
|
||||||
|
|
||||||
|
const result1 = testModel.doNameRandom();
|
||||||
|
const result2 = testModel.doNameRandom();
|
||||||
|
expect(result1).toBe(result2);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user