Techniki Zaawansowane
2 godz. 35 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.
TypeScript umożliwia stosunkowo prostą migrację istniejących projektów JavaScript. W kursie na przykładzie zostały omówione trzy strategie, dzięki którym jesteśmy w stanie dodać statyczne typowanie do istniejącego kodu. W procesie migracji najważniejsze jest to, że przepisywanie kodu jesteśmy w stanie uzależnić również od poziomu naszej wiedzy na temat TypeScriptu i stopniowo dodawać kolejne elementy.
Na pierwszy rzut oka można uznać, że TypeScript tylko dodaje nam pracy, wymuszając dodatkową konfigurację oraz opisywanie typów. Mało tego zwiększa barierę wejścia w projekt dla mniej doświadczonych programistów. Trudno temu zaprzeczyć ALE - korzyści płynące ze statycznego typowania które wpływają na zmniejszenie liczby błędów oraz wykrywanie ich nawet na poziomie pisania kodu, oszczędzają czas który normalnie poświęcilibyśmy na późniejsze debugowanie aplikacji. Poza tym zwiększenie stabilności aplikacji daje szerokie korzyści biznesowe, które wielokrotnie wynagradzają nam czas wymagany na pisanie dodatkowej składni.
JavaScript jest językiem dynamicznie typowanym. W trakcie wykonywania programu, zmienne mogą zmieniać swój typ a my nie zawsze mamy nad tym świadomą kontrolę. Tylko ... po co nam ta kontrola? Główną zaletą statycznego typowania jest to aby uniknąć sytuacji w których przypadkowo przypisujemy tekst do zmiennej która powinna zawierać liczbę lub sytuacji w której przekazujemy do funkcji nieprawidłowe dane. Taki rodzaj pomyłek generuje błędy odniesienia (eng. ReferenceError), które zatrzymują działanie skryptu i są momentami bardzo uciążliwe do wykrycia. Dzięki statycznemu typowaniu, jesteśmy w stanie wykrywać je na etapie pisania kodu.
TypeScript na przestrzeni ostatnich lat zyskuje ogromną popularność w społeczności programistów JavaScript i coraz częściej jest nieodłącznym elementem ofert o pracę. W przypadku firm nastawionych na rozwój rozbudowanych aplikacji JavaScript już teraz jest w zasadzie standardem. Biorąc pod uwagę fakt, że najnowsze frameworki (np. Nest.js) wykorzystują TypeScript domyślnie, nauka tej technologii ma ogromny sens w kontekście rozwoju jako programista. I ostatnim argumentem za tym aby wziąć TypeScript na poważnie jest to, że stoi za nim firma Microsoft a on sam rozwijany jest już niemal 10 lat.
Ten kurs został stworzony z myślą o programistach, którzy podstawy TypeScriptu mają już za sobą i chcą poznać jego zaawansowane techniki. Aby w pełni wykorzystać wiedzę z tego kursu, niezbędna jest również zaawansowana znajomość JavaScriptu a w szczególności jego elementów prowadzonych w wersji ES6+. Zdecydowanie polecamy przerobienie kursu Podstawowego TypeScript, który znajdziesz na eduweb, przed korzystaniem z tego materiału.
3.9+
W tym filmie kontynuujemy temat type guard a konkretnie przedstawię
ci operator instanceof zanim jednak to zrobimy chciałbym jeszcze krótko
nawiązać do przykładu z poprzedniej lekcji w którym wykorzystaliśmy operator
in aby obsłużyć poszczególne typy okazuje się że w
tym miejscu mamy do dyspozycji pewną alternatywę o której mówiliśmy sobie
w kursie podstawowym konkretnie dotyczy to operatora as który
wykorzystujemy w momencie gdy wiemy o typie więcej niż typescript w
takiej konfiguracji jak teraz to oczywiście nie działa ponieważ musimy zastosować
to nieco inaczej w tym konkretnym przypadku asercji
użyjemy w taki sposób że nasz przekazany argument niejako
potraktujemy jako typ song a następnie sprawdzimy czy wewnątrz
niego znajduje się właściwość title jeżeli tak to w tym miejscu
jesteśmy ją w stanie nawet zwrócić jeżeli tak to w tym miejscu nawet
możemy ją zwrócić problem polega na tym że jeżeli zrobimy teraz
tak pomimo tego że teoretycznie sprawdziliśmy tutaj typ no
to niestety ten mechanizm type guard ponieważ typescript nadal w tym miejscu
nie ma zielonego pojęcia na jakim typie danych pracujemy oczywiście
możemy to naprawić poprzez ponowne wykorzystanie mechanizmu asercji po
prostu podobnie jak wyżej w nawiasie zapisuję media as song
no i teraz w momencie gdy uruchomię ten skrypt wszystko będzie tutaj w
porządku nie zmienia to jednak faktu że w tym momencie trochę skomplikowałem
sobie życie zdecydowanie lepiej było tutaj zwrócić po prostu
właściwość title ale w zamian wykorzystamy tutaj operator instanceof
jak widzisz zdecydowanie wygląda to teraz lepiej i
mało tego jestem w stanie tutaj zwrócić bezpośrednio właściwość name
typescript automatycznie będzie wiedział że jeżeli nawet zrobimy tymczasowo z tego obiektu
playlistę no to otrzymamy właściwy tytuł no to
otrzymamy właściwy tytuł i dowodem na to jest fakt że w tym miejscu
typescript wie że mamy do czynienia z play listą a w tym miejscu że
z utworem mam nadzieję że to jest dla ciebie akurat jasne ale
pozwól że wyjaśnię teraz krótko na czym polega w ogóle działanie operat
instanceof na tym etapie prawdopodobnie doskonale wiesz
że javascript wykorzystuje dziedziczenie oparte o prototypy oznacza
to że jeżeli w javascripcie wykorzystujemy klasy to tak naprawdę nie
mamy tutaj do czynienia z taką klasą którą znamy z innych języków programowania
natomiast jest to po prostu ułatwiający nam programowanie
syntactic sugar dla takiego zapisu pod maską dzieje
się dokładnie coś takiego jest tworzona w funkcjach do której przekazujemy
jakiś argument a następnie ten argument przypisujemy do obiektu this
następnie sama metoda play przypisywana jest po prostu
do prototypu tego obiektu dodam tylko że w tej chwili po prostu zignoruj
błędy które tutaj mamy ten zapis jest jak najbardziej poprawnym
kodem javascript chciałem ci tylko krótko przypomnieć o fakcie w jaki
sposób działają klasy w javascripcie teraz bardziej istotne jest
to że jeżeli na podstawie tak utworzonej klasy utworzymy nowy obiekt
i tutaj przekazuję tytuł no to mam kilka sposobów na to aby sprawdzić
czy ten obiekt jest utworzony na podstawie tej klasy inaczej
mówiąc obiekt który tworzymy na podstawie jakiejś klasy określamy jej
instancją czyli wystąpieniem mógłbym mieć
tutaj wiele takich obiektów i po prostu umówilibyśmy o wielu instancjach
tej samej klasy dlatego też operator instanceof jak sama nazwa
wskazuje sprawdza czy przekazany obiekt jest
instancją określonej klasy dlatego jeżeli ten operator wykorzystamy
w połączeniu z naszym obiektem oraz klasą otrzymamy wartość true
no bo faktycznie obiekt media powstał na podstawie klasy movie
tak się składa że oprócz tego musisz wiedzieć jeszcze kilka małych rzeczy
w związku z tym że media jest tak naprawdę obiektem a
w javascripcie wykorzystujemy dziedziczenie oparte o prototypy no to
nasz obiekt media również jest instancją klasy object jest to
coś czego powinieneś być świadomy ze względu na to że mielibyśmy tutaj
obiekty różnych klas no to przyrównując je do klasy object
z za każdym razem będziemy mieć tutaj true mówiąc jeszcze
o porównywaniu obiektu do jego klasy jesteśmy w stanie również porównać
prototypy tego obiektu no bo ponownie pomimo tego że tutaj
mamy do czynienia z klasą tak jak ci pokazałem przed chwilą nadal dla
tej klasy tworzony jest prototyp więc jeżeli teraz z pomocą metody
getPrototypeOf pobierzemy prototyp obiektu media
jesteśmy w stanie go ściśle porównać do prototypu klasy movie i
tutaj jeżeli wszystko się zgadza otrzymamy true zatem
po raz kolejny otrzymaliśmy tutaj potwierdzenie że obiekt media tworzony
jest na podstawie klasy movie i ostatecznie już do
dyspozycji mamy jeszcze jedną rzecz którą możemy sprawdzić mianowicie
możemy porównać konstruktor tutaj ponownie odwołam się do
faktu że klasa tak naprawdę jest funkcją a konkretnie specjalnym
rodzajem funkcji czyli funkcją konstruktorem na podstawie której możemy
tworzyć nowe obiekty taki konstruktor posiada również obiekt który
tworzymy na podstawie tej klasy więc jeżeli porównamy te funkcje również
otrzymujemy true i tym samym po raz kolejny mamy potwierdzenie
że mamy tutaj do czynienia z instancją wskazanej klasy pamiętaj
jednak że jako type guard możemy wykorzystywać operator instanceof
wtedy typescript jest w stanie samodzielnie domyśli się z jakiego
typu danymi mamy do czynienia domyślam się że to co właśnie powiedziałem
może stanowić dla ciebie masę informacji ale możesz po prostu zapamiętać
fakt że aby sprawdzić czy obiekt jest instalacją danej klasy czyli
czy został na jej podstawie utworzony możesz wykorzystać operator
instanceof i taki operator idealnie sprawdza się jako
type guard dzięki niemu jesteś w stanie obsłużyć różne
rodzaje danych wewnątrz tej samej funkcji temat type guard jest
tematem którymu powinieneś poświęcić więcej uwagi ze względu na to
że jest on nieodłącznym elementem typescriptu na ten moment z mojej
strony to już wszystko i zapraszam cię do kolejnej lekcji
media object · 6 min
const media = new Movie('Gone in 60 seconds.');
media instanceof Movie /*?*/
media instanceof Object /*?*/
Object.getPrototypeOf(media) === Movie.prototype /*?*/
media.constructor === Movie; /*?*/