readonly ve třídách
Některé hodnoty by se po vytvoření objektu už neměly měnit: jméno hrdiny, číslo úkolu, identifikátor v uložené hře. V lekci 4 jste takové vlastnosti označovali readonly a u vlastností tříd to funguje stejně:
class Hrdina {
readonly id: number;
readonly jmeno: string;
uroven: number = 1;
constructor(id: number, jmeno: string) {
this.id = id;
this.jmeno = jmeno;
}
prejmenuj(noveJmeno: string): void {
this.jmeno = noveJmeno;
}
}
const kira = new Hrdina(1, "Kira");
kira.jmeno = "Kiraa";TypeScript ohlásí:
main.ts(12,14): error TS2540: Cannot assign to 'jmeno' because it is a read-only property.
main.ts(17,6): error TS2540: Cannot assign to 'jmeno' because it is a read-only property.Vlastnost jen pro čtení (readonly) dostane hodnotu buď jako počáteční hodnotu, nebo v konstruktoru, a jinde se jí přiřadit nedá. Potom ji už nikdo nezmění: ani kód mimo třídu, ani vlastní metody třídy, jako prejmenuj výše. Číst ji smí kdokoli: kira.jmeno je v pořádku.
readonly, nebo private? Každé chrání něco jiného:
privateurčuje, kdo smí vlastnost používat: číst a měnit ji smí jen třída.readonlyurčuje, kdy se smí změnit: jen při vytváření objektu. Číst ji smí každý.
Obojí se dá spojit: private readonly tajemstvi: string; je vlastnost, kterou smí číst jen třída a která se nikdy nezmění. A rozdíl oproti const: const je pro proměnné, readonly pro vlastnosti.
Stejně jako private existuje i readonly jen pro TypeScript; v JavaScriptu, který se spustí, je to obyčejná vlastnost. TypeScript ale zkontroluje celý program dřív, než poběží, takže ji žádný řádek vašeho programu nezmění.
Vlastnost jen pro čtení zachytí víc než úmyslné změny. Vzpomínáte na klasickou chybu z kurzu JavaScriptu, = místo === v podmínce? Program v editoru ji obsahuje.
Jak psát:
Pokyny
Spusťte program: vypíše Bruno je tady! a Kira se najednou jmenuje Bruno. Udělejte z vlastností id a jmeno vlastnosti jen pro čtení. TypeScript pak ohlásí řádek s chybou. Opravte ho, aby jméno porovnával, a ne přiřazoval. Kira zůstane Kirou:
Hrdina { id: 1, jmeno: "Kira", uroven: 2 }Za jmeno přidejte třetí vlastnost jen pro čtení: povolani typu Povolani (typ je na začátku programu). Konstruktor ji dostane jako třetí parametr. Kiru vytvořte jako hraničářku: new Hrdina(1, "Kira", "hranicar"). Program pak vypíše:
Hrdina { id: 1, jmeno: "Kira", povolani: "hranicar", uroven: 2 }Začněte programovat zdarma
5/9