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+
Na ten moment wiemy już w jaki sposób
określać typy danych i jednocześnie wiemy też, że w niektórych sytuacjach TypeScript
jest w stanie określić je samodzielnie. Ale mogą zdarzyć się sytuacje,
w których to my będziemy wiedzieć więcej na temat typów.
Wtedy musimy go w odpowiedni sposób o tym poinformować.
I takie informowanie nazywa się asercją typów.
Jako dodatek do tej lekcji powiemy sobie również o aliasach.
Z kolei w drugiej części lekcji pokażę Ci jeszcze czym są aliasy.
Weźmy sobie pierwszy przykład sytuacji, w której
to my wiemy więcej na temat typu. Stwórzmy
sobie zatem nowy typ, który określi nam strukturę naszego obiektu.
Następnie ten obiekt musimy stworzyć
i załóżmy, że chcemy te informacje gdzieś przesłać,
w związku z tym konwertujemy ten obiekt na jej JSON string.
Następnie po drugiej stronie przechwytujemy
te dane i musimy je ponownie przekształcić na obiekt.
Problem jednak polega na tym, że na ten moment
TypeScript nie wie tutaj nic na temat typu tego obiektu.
W efekcie TypeScript nie jest nam w stanie
również podpowiadać właściwości tego obiektu.
Ale teraz jeżeli poinformujemy go o konkretnym typie tego obiektu, wszystko
powinno wrócić do normy i ku temu mamy dwa sposoby.
Jednym z nich jest następujący zapis.
To jest właśnie zapis charakterystyczny dla asercji typów.
I on właśnie wystarcza do tego, aby poinformować TypeScript o typie danych.
Alternatywnym sposobem wskazania typu jest
wykorzystanie konstrukcji S, czyli stąd usuwamy typ i zapisujemy go w ten sposób.
W tym momencie TypeScript ma już komplet
informacji do tego, aby pomagać nam w zapisie.
Zobacz, że mamy tutaj właściwości naszego obiektu.
Także jak widzisz mamy tutaj naturalną korzyść wynikającą z asercji.
Kolejnym przykładem, w którym asercja
świetnie się sprawdza jest praca z elementami DOM.
Konkretnie spójrzmy teraz na ten fragment.
Pobieramy tutaj element o klasie input i w związku z tym, że wykorzystaliśmy metodę
querySelector, TypeScript jest w stanie określić, że mamy tutaj
do czynienia z elementem. No i być może wszystko byłoby w porządku gdyby nie fakt,
że w przypadku elementu input chciałbym odczytać chociażby jego wartość.
Więc jeżeli teraz się do niego odwołam, TypeScript nie jest w stanie ani mi podpowiedzieć
i co gorsza informuje mnie o tym, że właściwość value nie istnieje.
Wynika to konkretnie z faktu, że ten element powinien być typu HTML input
element i to dokładnie określimy z pomocą asercji.
Teraz TypeScript ma komplet informacji no i nie robi nam problemu o właściwość value.
Na ten moment w kontekście asercji warto
jeszcze, żebyś wiedział jedną rzecz. Mianowicie samą asercję możesz kojarzyć
z rzutowaniem typów w innych językach programowania.
No i faktycznie asercja jest jak
rzutowanie typów, ale w stu procentach rzutowaniem nie jest.
Konkretniej odróżnia ją od tego procesu fakt, że TS nie dokonuje tutaj dodatkowej
weryfikacji tych typów, tylko po prostu ufa nam, że wiemy co robimy.
Dodatkowo asercja w żaden sposób nie modyfikuje samej wartości.
I na tym właśnie się zatrzymamy. Do asercji z pewnością będziemy jeszcze wracać,
ale teraz wyjaśnię Ci czym są aliasy.
Jak sama nazwa wskazuje alias jest
alternatywną nazwą typu. Zobaczmy w jakiej sytuacji może okazać się to przydatne.
Definiuje tutaj zmienną, która
wykorzystując string literal type może przyjmować wartość medium lub large.
Załóżmy teraz, że będziemy chcieli przekazać tą zmienną do funkcji.
Tutaj w przypadku parametru muszę ponownie określić ten typ.
Już na pierwszy rzut oka widzimy, że mamy tutaj powtórzenie.
Oczywiście na to jeszcze moglibyśmy przymknąć oko,
ale możemy zrobić tak: po prostu definiuję nowy typ słowem
kluczowym type, w którym również z pomocą string literal type określam typ danych.
Teraz możemy wykorzystać ten alias w tym miejscu oraz w tym.
Swoją droga nic nie stoi na przeszkodzie, aby w takim
typie znalazły się również odwołania do innych typów, dzięki czemu zyskujemy
większą czytelność i elastyczność naszego kodu.
Dodam tylko jeszcze, że w takiej sytuacji po najechaniu na typ, możesz uzyskać
informację o tym jakie wartości w tym przypadku są dopuszczalne.
W przypadku większej aplikacji ma to szczególne znaczenie.
Na ten moment na temat asercji oraz aliasto już wszystko.
Do usłyszenia za chwilę.
Type assertion · 2 min
// Type assertion
type Game = { title: string; genre: string; released: boolean }
const game: Game = {
title: "Grand Theft Auto V",
genre: "Action",
released: true,
}
const serializedGame = JSON.stringify(game)
const gameObj = JSON.parse(serializedGame) as Game
gameObj.genreHTML types · 3 min
const input = <HTMLInputElement>document.querySelector(".input")
input.valueType aliases · 4 min
// Type aliases
type NumberAlias = number
type CoffeeSize = "medium" | "large"
let coffeeSize: CoffeeSize
function order(coffee: CoffeeSize) {
return `Ordered ${coffee}`
}