Skip to content

Commit d74b7ec

Browse files
committed
feat: add cache example of a decorator
1 parent 75cf9f1 commit d74b7ec

5 files changed

Lines changed: 110 additions & 0 deletions

File tree

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5+
return c > 3 && r && Object.defineProperty(target, key, r), r;
6+
};
7+
function cache(target, key, descriptor) {
8+
const originalMethod = descriptor.value;
9+
const memory = new Map();
10+
descriptor.value = function (...args) {
11+
const key = JSON.stringify(args);
12+
if (!memory.has(key)) {
13+
console.log('calcolo valore');
14+
const result = originalMethod.apply(this, args);
15+
memory.set(key, result);
16+
return result;
17+
}
18+
console.log('recupero valore');
19+
return memory.get(key);
20+
};
21+
return descriptor;
22+
}
23+
class NonEAcqua {
24+
doSomething(x) {
25+
return x * 2;
26+
}
27+
}
28+
__decorate([
29+
cache
30+
], NonEAcqua.prototype, "doSomething", null);
31+
const obj = new NonEAcqua();
32+
obj.doSomething(42);
33+
obj.doSomething(42);
34+
obj.doSomething(42);

typescript/decorators/cache/package-lock.json

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"dependencies": {
3+
"typescript": "^5.3.3"
4+
}
5+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
function cache(target: any, key: string, descriptor: PropertyDescriptor) {
2+
const originalMethod = descriptor.value;
3+
const memory = new Map<any, any>();
4+
5+
descriptor.value = function (...args: any[]) {
6+
const key = JSON.stringify(args);
7+
8+
if (!memory.has(key)) {
9+
console.log('calcolo valore')
10+
const result = originalMethod.apply(this, args);
11+
memory.set(key, result);
12+
return result;
13+
}
14+
15+
console.log('recupero valore')
16+
return memory.get(key);
17+
};
18+
19+
return descriptor;
20+
}
21+
22+
class NonEAcqua {
23+
@cache
24+
doSomething(x: number): number {
25+
return x * 2;
26+
}
27+
}
28+
29+
30+
const obj = new NonEAcqua()
31+
obj.doSomething(42)
32+
obj.doSomething(42)
33+
obj.doSomething(42)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"compilerOptions": {
3+
"target": "ES6",
4+
"experimentalDecorators": true,
5+
"outDir": "./build/"
6+
}
7+
}

0 commit comments

Comments
 (0)