123 lines
4.0 KiB
TeX
123 lines
4.0 KiB
TeX
\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}
|