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 tej lekcji omówimy sobie trzy pozostałe
typy a konkretnie będą to any, voidy i never.
Są one dość specyficzne i przede wszystkim nie możesz ich tak po prostu spotkać
w JavaScripcie, więc właśnie z tego powodu zasługują na oddzielną lekcję.
Pierwszy w kolejce jest typ any
i oznacza on dosłownie, że zmienna może być dowolnego typu.
I teraz ciekawe jest to, że jeżeli
deklarujemy zmienną i nie wskażemy jej typu ani nie piszemy wartości, więc
nie zainicjalizujemy jej na samym początku
to taka zmienna przyjmie typ any.
Na ten moment nie muszę tego robić, ale żeby wszystko było jasne dodam ten typ.
Teraz w momencie gdy będę do tej zmiennej przypisywał nowe wartości,
czyli teoretycznie mamy tutaj typ number,
ale TS w żaden sposób nie informuje nas, że coś jest nie tak.
Mało tego, pomimo tego, że teraz przypisaliśmy
do niej wartość zmienna ta nadal posiada typ any.
Wynika to z faktu, że w tym miejscu ten typ
został już określony i wskazuje właśnie na any.
Także w tej sytuacji nic nie stoi
na przeszkodzie, abym do tej zmiennej przypisał też inne wartości np.
tekst i wszystko dalej jest w porządku.
Oczywiście w porządku tylko w kontekście
tego, że TS nie wyrzuca nam żadnego błędu, ale jednocześnie też
nie mamy tutaj żadnej korzyści wynikającej z określenia typu.
Z tego też powodu rekomendowane jest to, aby unikać typu any tak często jak to możliwe,
a najlepiej poza ściśle określonymi przypadkami w ogóle go nie stosować.
Oczywiście ten typ świetnie się sprawdza w momencie gdy mamy jakąś aplikację, którą
tłumaczymy z czystego JavaScriptu do TypeScriptu, bo wtedy ma miejsce sytuacja
w której stopniowo zamieniamy nasz kod na TS. Więc wykorzystanie tutaj any sprawia,
że jesteśmy w stanie z Type Scriptu wcześniej korzystać,
bez konieczności przepisywania całej aplikacji.
Poza tym mam tutaj prosty przykład
pokazujący, że ten typ any w niektórych sytuacjach ma sens.
Mam tutaj funkcję reverse, która odwraca string lub przekazaną tablicę.
I ta funkcja nie dba o to jakiego typu dane będą znajdowały się w tej tablicy.
Dlatego też typ any jest tutaj mile widziany.
Oczywiście jeżeli masz taką możliwość to
warto byłoby ten typ doprecyzować, ale w tej konkretnej sytuacji raczej jest to OK.
Kolejnym typem, który jest odwrotnością any jest typ void i z nim akurat mogłeś
spotkać się w innych językach programowania.
Ale tak jak powiedziałem w Java Scripcie on po prostu nie występuje.
Tak czy inaczej potrzebna będzie nam tutaj
zmiana a następnie funkcja, do której tą zmienną będziemy przekazywać.
I zadaniem tej funkcji jest, jak widzisz, wyświetlenie samego tekstu.
Nie mamy tutaj potrzeby zwracać jakiejkolwiek wartości i w momencie gdy
nie określę tutaj zwracanego przez nią typu, a na tym nie do końca nam zależy,
ponieważ ja chcę mieć pewność, że żadna wartość nie zostanie tutaj zwrócona.
Dlatego też precyzyjnie określam typ void oraz wrzucam tutaj console.log.
Na tym etapie zapewne wiesz, że w momencie gdy nic nie zwracamy z funkcji tak naprawdę
i tak zwraca ona undefined. I tutaj mamy tego potwierdzenie.
Zatem w przypadku typu void możemy spodziewać się wartości.
undefined lub null.
Przy czym zwrócenie tutaj null zadziała tak długo,
gdy w konfiguracji naszego TypeScriptu nie będziemy mieli opcji strickNullChecks.
Tak czy inaczej widzisz, że typ void bywa w niektórych sytuacjach przydatny.
Bo tak jak powiedziałem: w momencie gdybyśmy przypadkowo zwracali tutaj jakąś wartość
to TypeScrip poinformuje nas o tym, że nie możemy tego zrobić.
No i jak doskonale wiesz w niektórych
miejscach chcemy dokładnie aby tak było.
W kontekście typu void
to już wszystko i teraz został nam ostatni typ, czyli typ never.
I on akurat jest najrzadziej spotykany
z tych wszystkich typów, które mamy do dyspozycji. Natomiast są dosłownie
pojedyncze przypadki, w których możemy go wykorzystać.
Pierwszym z nich są funkcje, których zadaniem jest wyrzucenie jakiegoś błędu.
W tej sytuacji chcemy mieć absolutną
pewność, że nic z tej funkcji nie zostanie zwrócone.
No i tutaj faktycznie tak jest, ponieważ
błąd nie zostanie zwrócony tylko wyrzucony.
Kolejnym przykładem funkcji, w których typ never
się sprawdza są funkcje, które z definicji nie powinny się nigdy zakończyć.
Tego typu funkcje są bardzo rzadko
wykorzystywane, ale jeżeli z jakiegoś powodu chcielibyśmy zrobić coś takiego
to właśnie typ never jest tym, z którego powinniśmy skorzystać.
Na koniec dnia jednak mi jeszcze do tej pory nie zdarzyło się z niego korzystać, więc
zapamiętaj tylko tyle, że typ never oznacza że wartość nigdy nie występuje.
Jak widzisz w tych konkretnych przypadkach ta definicja jest wypełniona.
Na ten moment jeżeli chodzi o funkcje to już wszystko.
A ja zapraszam Cię do kolejnej lekcji.