od Podstaw
1 godz. 54 min · Typescript · Full-stack i Programowanie
Adam GospodarczykZacznijmy od tego, że JavaScript jest dynamicznie typowany. Oznacza to, że typy zmiennych mogą się zmieniać w czasie wykonywania programu, a my nie mamy nad nimi kontroli. A po co nam ta kontrola? Między innymi po to, aby przypadkowo nie dodać typu number do string lub przekazać do funkcji nieprawidłowe danych. Ogromną zaletą jest to, że o tego typu błędach dowiadujemy się już na etapie pisania kodu a nie dopiero w trakcie jego wykonywania... na produkcji.
Prawdopodobnie znasz mechanizm intellisense, czyli inteligentnego podpowiadania kodu przez edytor. Pisząc kod w TypeScript, tworzysz definicje typów dotyczących Twojej aplikacji. W ten sposób dostęp do definicji klas i właściwości obiektów masz właściwie na wyciągnięcie myszki. Wystarczy "hover" na funkcji aby uzyskać szczegółowe informacje, które pomogą Ci w pisaniu kodu. Oprócz tego otrzymasz również automatyczne podpowiedzi w trakcie dostępu do właściwości i metod. Nic tylko pisać kod!
Nie musisz przepisywać całego projektu. TypeScript stanowi nadzbiór JavaScriptu. Zatem cały Twój projekt jest z nim w 100% kompatybilny, a Ty możesz stopniowo dodawać definicje typów. Nawet nie będziesz wiedział kiedy typy pojawią się w całej Twojej aplikacji. To daje Ci również możliwość uczenia się TypeScriptu w trakcie jego wdrażania. W tym kursie opanujesz podstawy a później... sam zobaczysz!
Ten kurs został stworzony z myślą o programistach, którzy podstawy JavaScriptu mają już za sobą i chcą poznać zalety statycznego typowania oferowanego przez TypeScript. Na początku Kursu zaczynamy również od krótkiej powtórki najważniejszych elementów samego JS.
3.8+
Kontynuujemy teraz temat klas i porozmawiamy o tzw.
akcesorach, czyli inaczej mówiąc gettarach i setterach.
Mamy tutaj nieco okrojony przykład z poprzedniego odcinka.
Jak widzisz mamy tutaj klasę, która zawiera jedną prywatną właściwość title,
którą próbujemy tutaj odczytać i oczywiście otrzymujemy błąd.
Pytanie jednak brzmi czy możemy dostać się
w jakiś sposób do tej właściwości spoza klasy, nie zmieniając jej trybu dostępu.
Odpowiedzią jest właśnie temat naszego odcinka, czyli gettery i settery.
Konkretnie są to specjalne rodzaje metod, które poprzedzamy odpowiednim słowem
kluczowym get lub set. W tym przypadku mamy do czynienia z getterem.
Jego rola będzie polegała na tym, aby
zwrócić naszą właściwość. Teraz, jak widzisz, nadal tutaj mam błąd ze względu
na to, że odwołuję się bezpośrednio do nazwy właściwości zamiast do nazwy gettera.
Jeżeli teraz zmienię tę nazwę na poprawną otrzymam tytuł naszego filmu.
Chciałbym w tym miejscu zwrócić Twoją uwagę na pewną notację.
Konkretnie chodzi o zastosowanie
podkreślenia przed nazwą zmiennej. W dokumentacji TypeScriptu
znajdziesz informację o tym, że takiej notacji należy unikać w przypadku
prywatnych właściwości klas, ale nie znajdziesz już tam informacji o tym, że
taka notacja w przypadku getterów i setterów jest konieczna.
I nawet same przykłady z dokumentacji same ją wykorzystują.
W tym wszystkim chodzi tutaj o to, aby
rozróżnić nazwę gettera od nazwy właściwości.
Zapis wykorzystujący podkreślenie w mojej
opinii jest najlepszym ku temu sposobem. Rozróżnienie tych nazw jest ważne o tyle,
że gdybyśmy wykorzystali również podkreślenie mielibyśmy zduplikowaną właściwość naszej
Klasy a coś takiego oczywiście nie jest dopuszczalne.
I teraz aby udowodnić Ci, że w tym miejscu faktycznie wykonywany jest nasz getter
zmodyfikujemy teraz zwracaną przez niego wartość.
I właśnie w tym momencie widzimy kolejną
zaletę akcesorów, czyli możliwość bardzo precyzyjnego określenia w jaki sposób
otrzymywane i odczytywane są właściwości naszej klasy.
Oczywiście na tym etapie moglibyśmy przeprowadzać np.
jakąś walidację i np.
sprawdzać czy tytuł nie jest dłuższy niż określona liczba znaków, albo cokolwiek
innego czego właśnie w danej chwili potrzebujemy.
Na tym etapie wiemy już w jaki sposób możemy posługiwać się getterami.
No i nadszedł czas na wykorzystanie setterów.
Tutaj sytuacja wygląda bardzo podobnie z tą różnicą, że wykorzystujemy tutaj słowo
kluczowe set a następnie jako parametr tego settera przekazujemy nowy tytuł.
Jak widzisz dbam również o spójność typów
i dzięki temu bez obaw mogę ustawić nowy tytuł w następujący sposób.
Zatem w tym momencie, w tym miejscu odwołuję się do naszego gettera, a żeby
ustawić nowy tytuł odwołuję się do settera w następujący sposób. Jak widzisz
nie wykonuję tutaj metody, tylko po prostu przypisuję nowy tytuł.
Dzięki temu jeżeli teraz go odczytamy, otrzymujemy zaktualizowaną wartość.
No i teraz podobnie jak getter, setter również
umożliwia nam kontrolę tego w jaki sposób dane zostaną zapisane do naszej klasy.
Mało tego musisz wiedzieć, że w tym momencie wykorzystujemy te akcesory
do tego, aby komunikowały się z kodem na zewnątrz klasy.
Nic nie stoi jednak na przeszkodzie, aby zarówno setter jak i getter były prywatne.
Jedyne o co musimy zadbać to jeżeli
ustawiamy setter jako prywatny to getter również musi taki być.
W przeciwnym razie otrzymujemy tutaj informację o błędzie.
I teraz gdy już nasze akcesory są prywatne, nie możemy ich wykorzystywać na
zewnątrz klasy. Ale oczywiście nic teraz nie stoi na przeszkodzie, abyśmy
wykorzystywali je wewnątrz klasy movie.
W temacie getterów i setterów to już
wszystko, aczkolwiek jest jeszcze mała, ale istotna rzecz o której musisz wiedzieć.
Mianowicie w momencie, gdy wykorzystujesz je w swoim kodzie upewnij się proszę, że
w swoim pliku konfiguracyjnym kompilujesz do wersji S5 lub wyższej.
Przypominam tylko, że TypeScript domyślnie kompiluje się do wersji S3 a w niej
obsługa getterów i setterów nie jest wspierana.
No i w ten oto sposób kończymy tę lekcję.
A ja zapraszam Cię do kolejnej.
Klasa Movie · 1 min
class Movie {
constructor(private _title: string) {}
private set title(title: string) {
this._title = `${title}!`
}
private get title() {
return this._title.toUpperCase()
}
}Gettery i Settery · 3 min
const bestMovieEver = new Movie("Peaceful Warior")
bestMovieEver.title /*?*/ // getter
bestMovieEver.title = "Peaceful Warrior" // setter