Tartalomjegyzék
TypeScript OOP
- Szerző: Sallai András
- Copyright © 2021, Sallai András
- Szerkesztve: 2021, 2022, 2024
- Web: https://szit.hu
Osztály
class Dolgozo { nev: string; fiz: number; } let janos = new Dolgozo(); janos.nev = 'Nagy János'; janos.fiz = 2850000; console.log(janos.nev, janos.fiz);
Konstruktor
class Dolgozo { nev: string; fiz: number; constructor(nev: string, fiz: number) { this.nev = nev; this.fiz = fiz; } } let janos = new Dolgozo('Nagy János', 2850000); console.log(janos.nev, janos.fiz);
Nem lehet több konstruktort megadni, de beállíthatók opcionális paraméterek, így készíthetünk több alakú konstruktort.
A metódusokat sem írhatjuk le többször, de használhatjuk az opcionális paramétereket.
Öröklés
class Szemely { nev: string; constructor(nev: string) { this.nev = nev; } } class Dolgozo extends Szemely { fiz: number; constructor(nev: string, fiz: number) { super(nev); this.fiz = fiz; } } let janos = new Dolgozo('Nagy János', 2850000); console.log(janos.nev, janos.fiz);
Absztrakt osztály
Nem példányosítható, csak öröklésre használható. Az absztrakt osztályban előírhatók kötelezően megvalósítandó tulajdonságok és metódusok.
abstract class Szemely { nev: string; constructor(nev: string) { this.nev = nev; } abstract emelFizetes(number); } class Dolgozo extends Szemely { fiz: number; constructor(nev: string, fiz: number) { super(nev); this.fiz = fiz; } emelFizetes(mertek: number) { this.fiz = this.fiz + mertek; } } let janos = new Dolgozo('Nagy János', 2850000); console.log(janos.nev, janos.fiz); janos.emelFizetes(100000); console.log(janos.nev, janos.fiz);
Tagok elérése
Elérés szabályozása:
- public
- private
- protected
- readonly
A protected hasonlít a private-hoz, de kivétel, hogy a származtatott osztályokban elérhetők a tagok.
Nézzünk egy példát a private adattagra:
class Dolgozo { private nev: string; fiz: number; constructor(nev: string, fiz: number) { this.nev = nev; this.fiz = fiz; } kerNev(): string { return this.nev; } } let janos = new Dolgozo('Nagy János', 2850000); console.log(janos.kerNev(), janos.fiz);
A nev mező, csak a kerNev() metóduson keresztül érhető el. A mező, ebben a formában nem kaphat új értéket.
Vegyünk fel egy beállító metódust is:
class Dolgozo { private nev: string; fiz: number; constructor(nev: string, fiz: number) { this.nev = nev; this.fiz = fiz; } kerNev(): string { return this.nev; } allitNev(nev: string): void { this.nev = nev; } } let janos = new Dolgozo('Nagy János', 2850000); console.log(janos.kerNev(), janos.fiz); janos.allitNev('Kaland Ferenc'); console.log(janos.kerNev(), janos.fiz);
Most új értéket is beállíthatunk a nev mező számára.
Statikus tagok
Ha olyan osztályunk van, amiből csak egy dolgot reprezentálhat a valóságból, akkor érdemes statikus tagokat használni.
A következő példában egy saját matematikai osztályt deklarálunk. Mivel matematikából csak egy van, a példányosításnak nincs sok értelme. Ezért a PI mező statikusra állítjuk be, így a mező értékére példányosítás nélkül hivatkozhatunk, csak az osztály nevén keresztül:
class SajatMath { static PI: number = 3.1415926535; } console.log(SajatMath.PI);
Interfész
Típusként
interface Szemely { name: string; city: string; } var dolgozo: Szemely; dolgozo.name = 'Pali'; dolgozo.city = 'Szeged';
interface Szemely { name: string; city: string; } var dolgozo = <Szemely>{}; dolgozo.name = 'Pali'; dolgozo.city = 'Szeged';
Osztállyal
interface Szemely { name: string, city: string, greet(): string } class Dolgozo implements Szemely { name: 'János'; city: 'Szeged'; greet():string { return 'Üdv'; } } var mari: Dolgozo = new Dolgozo(); console.log(mari.greet());
Kivételek
try { throw new Error('Hiba! valami elromlott'); }catch(e) { console.log(e); }
var num: number = -1; try { if (num <0) throw new Error('Hiba! Negatív szám'); }catch(e) { console.log(e); }
A get és a set
Hagyományosan
- circle.ts
class Circle { private _radius: number; constructor(radius: number) { this._radius = radius; } getRadius(): number { return this._radius; } setRadius(value: number) { if (value >= 0) { this._radius = value; } else { console.log("Invalid radius value."); } } } const myCircle = new Circle(5); myCircle.setRadius(10); console.log(myCircle.getRadius()); // Kimenet: 10 myCircle.setRadius(-5); // Kimenet: Invalid radius value. console.log(myCircle.getRadius()); // Kimenet: 10
A get és set használata
- circle.ts
class Circle { private _radius: number; constructor(radius: number) { this._radius = radius; } get radius(): number { return this._radius; } set radius(value: number) { if (value >= 0) { this._radius = value; } else { console.log("Invalid radius value."); } } } const myCircle = new Circle(5); myCircle.radius = 10; console.log(myCircle.radius); myCircle.radius = -5; // Kimenet: Invalid radius value. console.log(myCircle.radius);
Mi a különbség? Ugyanazt valósítják meg. Van aki szerint a get és a set használata átláthatóbbá és rugalmasabbá teszi a kódot.