\section{Enum/Osztályok} \begin{frame}[fragile]{Enum alapok} \footnotesize Az \texttt{enum} (felsorolt típus) egy névvel ellátott, korlátozott értékkészletet definiál -- hasonló célt szolgál, mint a korábban látott string literal union, de saját névtérrel és futásidejű objektummal is jár. \begin{lstlisting}[language=JavaScript,style=NodeJS] enum Role { Admin, // 0 Editor, // 1 Viewer, // 2 } enum Status { Pending = 'pending', Active = 'active', Closed = 'closed', } const myRole: Role = Role.Admin; \end{lstlisting} Numerikus enumnál automatikusan 0-tól számozódnak az értékek; string enumnál mi adjuk meg a konkrét szöveges értéket -- ez utóbbi jobban olvasható naplókban, hibaüzenetekben. \end{frame} \begin{frame}[fragile]{Osztályok TypeScript-ben} \footnotesize A TypeScript osztályai a JavaScript ES6 osztályaira épülnek, kiegészítve a mezők típusozásával. \begin{lstlisting}[language=JavaScript,style=NodeJS] class Person { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } greet(): string { return `Szia, ${this.name} vagyok!`; } } const p = new Person('Anna', 25); \end{lstlisting} \end{frame} \begin{frame}[fragile]{Access modifierek} \footnotesize Az osztály mezőihez és metódusaihoz \textbf{láthatósági szinteket} rendelhetünk -- ez segít elrejteni az implementációs részleteket, és csak a szándékolt "publikus felületet" mutatni kifelé. \begin{lstlisting}[language=JavaScript,style=NodeJS] class BankAccount { private balance: number = 0; public readonly owner: string; constructor(owner: string) { this.owner = owner; } public deposit(amount: number): void { this.balance += amount; } } \end{lstlisting} \begin{itemize} \item \textbf{\texttt{public}} (alapértelmezett): bárhonnan elérhető \item \textbf{\texttt{private}}: csak az osztályon belülről érhető el \item \textbf{\texttt{protected}}: az osztályon és leszármazottjain belül érhető el \end{itemize} \end{frame} \begin{frame}[fragile]{Interfész implementálása osztállyal} \footnotesize Egy osztály az \texttt{implements} kulcsszóval kötelezettséget vállal arra, hogy megfelel egy adott interfésznek -- a fordító ellenőrzi, hogy tényleg minden szükséges mezőt/metódust megvalósít-e. \begin{lstlisting}[language=JavaScript,style=NodeJS] interface Greetable { greet(): string; } class Person implements Greetable { constructor(private name: string) {} greet(): string { return `Szia, ${this.name} vagyok!`; } } \end{lstlisting} \end{frame} \begin{frame}[fragile]{Decorators -- rövid kitekintés} \footnotesize A \textbf{decorator} egy speciális jelölés (\texttt{@valami}), amit osztályok, mezők vagy metódusok elé írhatunk, és ami futásidejű viselkedést csatol hozzájuk -- kicsit hasonlóan ahhoz, ahogy Express-ben a middleware-ek "csomagolják be" a route handlereket. \begin{block}{Miért fontos ez most csak kitekintésként?} A decorators ma még kísérleti funkció TypeScript-ben, de rendkívül elterjedt az ORM-ekben (pl. a későbbi heteken megismert TypeORM) -- ott \texttt{@Entity}, \texttt{@Column} jelölésekkel írjuk le az adatbázis-táblákat. \end{block} \begin{lstlisting}[language=JavaScript,style=NodeJS] @Entity() class User { @Column() name: string; } \end{lstlisting} \end{frame} \begin{frame}{Összefoglalás -- Enum és Osztályok} \footnotesize \begin{block}{Enum és Osztályok} \begin{itemize} \item \texttt{enum}: névvel ellátott, korlátozott értékkészlet (numerikus vagy string alapú) \item Osztályok: mezők típusozása, konstruktor, metódusok -- az ES6 osztályokra épül \item Access modifierek: \texttt{public} / \texttt{private} / \texttt{protected} -- a láthatóság szabályozása \item \texttt{implements}: egy osztály kötelezettséget vállal egy interfész megvalósítására \item Decorators: \texttt{@valami} jelölések, amik későbbi heteken (TypeORM) kerülnek elő \end{itemize} \end{block} \end{frame}