[[oktatas:web:typescript|< TypeScript]] ====== TypeScript dekorátor ====== * **Szerző:** Sallai András * Copyright (c) 2021, Sallai András * Szerkesztve: 2021, 2022, 2023, 2024 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Osztály dekorálása ===== ==== Példa 00 ==== function log(target: any) { console.log(typeof target) } @log class Valami { } new Valami() A Valami osztályból semmit nem valósítunk meg, mégis csinál valamit. Kiírja saját a konstruktor típusát. Az any helyett írhattuk volna Function típust. Szükséges beállítás: { "compilerOptions": { "experimentalDecorators": true } } ==== Példa 01 ==== Adattag hozzáadása: Ez a példa a típusellenőrzés szigorítása miatt nem működik, ha be van kapcsolva a "strict": true értékre. const Ageman = (constructor: Function) => { constructor.prototype.age = 43; } @Ageman class Man {} const man = new Man(); console.log(man['age']); Ahol elkészítem a Man osztály, csak elé írom a @Ageman dekorátort és már van is age adattagja. A következő két példa típusellenőrzés mellett is használható. Típus ellenőrzéssel is használható verzió: const Ageman = (constructor: Function) => { constructor.prototype.age = 43; } @Ageman class Man { age!: number; } const man = new Man(); console.log(man.age); Másik megoldás, szigorú típusellenőrzés esetén: const Ageman = (constructor: Function) => { constructor.prototype.age = 43; } @Ageman class Man { /** * Ez egy index aláírás * Lehetővé teszi dinamikus tulajdonságok * hozzáadását * A részek: * x: A kulcs bármilyen string típus lehet * Tetszőlegesen más név is adható az * x helyett, például key * any: Az érték bármilyen típust felvehet * */ [x: string]: any; } const man = new Man(); console.log(man.age); ==== Példa 02 ==== function alap() { return function (constructor: Function) { constructor.prototype.fiz = 300; } } @alap() class Dolgozo { [x: string]: any; } var mari = new Dolgozo(); console.log(mari.fiz ); A Dolgozo osztály üres, de kidekoráltuk az @alap() dekorátorral, így már van egy fiz adattagja. ==== Példa paraméterrel ==== function alapfiz(alap: number) { return function (constructor: Function) { constructor.prototype.fiz = alap; } } @alapfiz(300) class Dolgozo { [x: string]: any; } var mari = new Dolgozo(); console.log(mari.fiz); ===== Metódus dekorálása ===== function egy() { return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) { console.log('1-s dekorátor') } } class Dolgozo { @egy() valami() {} } var mari = new Dolgozo(); mari.valami(); A valami() metódus üres, de kidkoráltuk az @egy() dekorátorral, így csinál is valamit. A konzolon megjelenő szöveg: 1-s dekorátor Szükséges kapcsoló: { "compilerOptions": { "experimentalDecorators": true } } Egy összetettebb tsconfig.json fájl: { "compilerOptions": { "rootDir": "src", "target": "es6", "experimentalDecorators": true } } ===== Linkek ===== * https://www.logicbig.com/tutorials/misc/typescript/class-decorators.html (2021) * https://www.typescriptlang.org/docs/handbook/decorators.html (2022)