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+
W tym filmie odpowiem Ci na pytanie czym
jest TypeScript. A odpowiedź jest stosunkowo prosta, ponieważ jest to stworzony przez
firmę Microsoft rozszerzenie języka JavaScript.
Istotny w tej odpowiedzi jest fakt, że jest to rozszerzenie, czyli inaczej mówiąc kod
napisany w JavaScript jest w pełni kompatybilny z TypeScriptem.
Dzięki temu możesz zacząć korzystanie z TypeScriptu
już dziś, nawet w projektach, które nie zostały w nim napisane.
Wystarczy, że stopniowo będziesz przepisywał kod na TypeScript.
I teraz: najważniejszą cechą TypeScriptu jest fakt, że wprowadza on tzw.
statyczne typowanie do JavaScriptu.
Pytanie teraz co to statyczne typowanie
oznacza i pozwól, że wyjaśnię Ci to na przykładzie.
Zapewne doskonale wiesz, że w JavaScript
nie mamy problemu z tym, aby przypisywać różne wartości do zmiennych.
Oczywiście tak długo, o ile nie mamy tutaj const.
W każdym razie w pierwszej linii number to oczywiście liczba.
Natomiast już w kolejnej linii, number
staje się stringiem. No i ostatecznie staje się wartością logiczną.
Jak widzisz JavaScript nie ma absolutnie
żadnego problemu z tym, że w trakcie wykonywania programu kilkukrotnie
zmieniliśmy tryb jednej konkretnej zmiennej.
Inaczej mówiąc, mamy tutaj do czynienia z dynamiczną zmianą typów czy też
dynamicznym typowaniem, który charakteryzuje JavaScript.
Natomiast spójrzmy teraz na ten sam kod w przypadku TypeScriptu.
Jak widzisz te dwa pliki w tej chwili różni wyłącznie rozszerzenie.
W przypadku TypeScriptu korzystamy z rozszerzenia TS.
W każdym razie zauważ, że już na tym etapie
nasz edytor sygnalizuje nam, że w tym kodzie znajduje się błąd.
Pytanie tylko dlaczego ten kod przed chwilą działał.
Otóż okazuje się, że zadziałało tutaj
właśnie statyczne typowanie i mamy informację o tym, że w przypadku zmiennej
number został już przypisany typ NUMBER, więc nie możemy zmienić go na kolejne.
Być może zastanawiasz się teraz dlaczego w ogóle chcemy sprawdzać typy.
Otóż chodzi tutaj o fakt, że w ramach
działającego programu zmienna raczej nie zmienia swojego typu, a jeżeli już tak się
dzieje to często prowadzi to do nieoczekiwanych rezultatów i największy
problem polega na tym, że o tego typu błędach najczęściej dowiadujemy się od
użytkowników korzystających z naszej aplikacji. A więc mamy tutaj pierwszą
zaletę TypeScriptu, czyli wyłapywanie błędów na wczesnym etapie developmentu.
Błędy, o których mówiłem mogą wyglądać np. tak:
Mamy tutaj proste działanie na dwóch
typach: liczbie oraz tekście. Teoretycznie spodziewamy się tutaj 3.
Natomiast w praktyce otrzymujemy 12.
I być może powiesz mi teraz, że taki błąd jest oczywisty.
No na takim przykładzie rzeczywiście tak
jest. Ale co w sytuacji, gdy jakaś wartość pochodzi np.
z formularza.
W takim przypadku o pomyłkę już bardzo łatwo.
Do statecznego typowania niejednokrotnie będziemy jeszcze wracać.
A tymczasem zobaczmy co jeszcze TypeScript ma nam do zaoferowania.
Statyczne typowanie daje nam coś jeszcze, czyli definicje typów.
Konkretnie chodzi tutaj o informacje
jakiego typu jest zmienna, parametr funkcji czy np.
wartość zwracana przez funkcję.
To wszystko sprawia, że możemy skorzystać z
mechanizmu IntelliSense, dzięki któremu nasz edytor staje się
mądrzejszy a nam programuje się zdecydowanie łatwiej.
Zobaczmy jak to wygląda w praktyce.
Programując w JavaScripcie niejednokrotnie musimy
korzystać z zewnętrznych bibliotek, które oferują nam jakieś API.
Przykładem takiej biblioteki może być chociażby ramda.
Po jej instalacji i zaimportowaniu do naszego pliku, nie mamy w tej chwili żadnej
opcji zobaczyć jakie metody nam udostępnia.
Jak widzisz w tej chwili Visual Studio Code nie ma tutaj nic do powiedzenia.
W takiej sytuacji informacje o definicjach
typów możemy sobie doinstalować. W przypadku ramdy wygląda to tak:
Instalując taki pakiet, nagle Visual Studio
Code staje się bardziej przydatny niż zwykle.
Swoją drogą, aby wyświetlić to menu wcinąłem CTR i spację.
Tak czy inaczej, jak widzisz, mamy tutaj
informacje o wszystkich udostępnianych przez ramde metodach.
Mało tego mamy tutaj opis tej metody.
Także w tej chwili możemy ją po prostu wykorzystać.
Tego typu zachowanie sprawdza się świetnie
również w ramach naszego kodu, czyli pisząc funkcje i definiując typy.
Jesteśmy w stanie w ramach aplikacji po prostu
sprawniej się poruszać i wykorzystywać istniejące funkcje.
Nie muszę chyba podkreślać faktu, że coś takiego niesamowicie usprawnia pracę
zarówno, nam jak i kolegom i koleżankom z zespołu. I na koniec mam jeszcze jeden
argument mówiący za tym, że warto korzystać z TypeSciptu.
To mianowicie chodzi o nowe funkcje języka JavaScript. Jak wiesz sam, JavaScript
zmienia się bardzo dynamicznie. Natomiast dodawanie nowych funkcji, często tych
bardzo przydatnych, zajmuje jednak trochę czasu.
No i tak się składa, że bardzo często te nowe funkcje szybciej implementowane są do
TypeScriptu, dzięki czemu możemy z nich korzystać już teraz.
Taka możliwość oczywiście wpływa pozytywnie na komfort naszej pracy.
Zobaczmy teraz na przykład takiej funkcji.
W najnowszej wersji TypeScript daje nam do dyspozycji prywatne właściwości klas.
Bo jak doskonale wiesz, w tej chwili, jeżeli tworzymy jakąś klasę a następnie obiekt na
podstawie tej klasy, możemy bez problemu odczytywać jej właściwości.
Niejednokrotnie jest to przyczyną wielu
błędów a poza tym po prostu nie zawsze tak być powinno.
Tak się akurat składa, że obecnie w
procesie TC 39, konkretnie na stage'u trzecim, czyli już tym bardzo zaawansowanym
znajduje się propozycja dotycząca prywatnych właściwości klas.
Zanim jednak będziemy mogli z niej
korzystać minie jeszcze przynajmniej kilka miesięcy od momentu nagrywania tego filmu.
Natomiast zwróć uwagę na to: powiększę
tylko trochę ekran i mamy informację o tym, że TypeScript w wersji 3.8 jest już dostępny i to co
nam oferuje to właśnie prywatne właściwości klas.
Dlatego w tym momencie wystarczy, że
przełączę się na plik TypeScript i dodam odpowiednią składnię,
aby otrzymać informację o tym, że popełniłem błąd a ten błąd polega na tym,
że próbuje odczytać wartość prywatnej właściwości.
Zatem jak widzisz, dzięki temu
TypeScriptowi już dziś korzystam z funkcji, które jeszcze nie są dostępne.
I w ten sposób mamy kolejny argument za tym, że warto nauczyć się TypeScriptu.
https://github.com/tc39/proposal-class-fields
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html
Klasa Avenger · 5 min
class Avenger {
#name: string
constructor(name: string) {
this.#name = name;
}
}
const hero = new Avenger("Steve Rogers");
hero.#name;