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 zaczynamy już twardą naukę TypeScriptu, począwszy od typów prostych.
Słowem wstępu
przypomnę tylko, że w JavaScripcie wyróżniamy siedem typów danych.
Zakładam teraz, że na tym etapie nauki te typy danych są Ci doskonale znane.
Niech tylko nie zmyli Cię fakt, że tytuł tej lekcji to typy proste
a mamy tutaj object. W tej liście chodzi mi
tylko o wszystkie typy, jakie mamy w JavaScripcie.
Typy, które tutaj widzisz są tak zwanymi typami dynamicznymi.
Oznacza to, że zmienne mogą zmieniać swój typ w trakcie wykonywania programu.
Jak wiesz jedną z głównych ról TypeScriptu jest dodanie typów statycznych, czyli
takich które istnieją na etapie developmentu oraz kompilacji.
Konkretnie chodzi o to, że zmienne czy właściwości mogą posiadać swój statyczny
typ, którego rolą jest przewidzenie jaki dynamiczny typ będzie posiadać zmienna
bądź właściwość w momencie wykonywania programu.
Na początek musisz wiedzieć, że w TypeScripcie
typów nie zapisujemy w ten sposób tylko małą literą.
Jest to postrzegane jako dobra praktyka.
No i jeżeli jesteśmy już przy typie number to oczywiście służy on do określania
zmiennych, które zawierają liczby. Tak długo, jeżeli przechowywana informacja w tej
zmiennej będzie liczbą, wszystko będzie w porządku.
Ale jak widzisz gdy tylko się to zmienia
otrzymujemy informację o tym, że nie możemy tak robić.
Mam nadzieję, że o tym pamiętasz.
Tymczasem w kontekście typu number
pamiętaj o tym, że możesz w nim przechowywać nie tylko liczby całkowite,
ale również te zapisane w systemie szesnastkowym
czy dwójkowym.
Dodam tylko, że akurat ta notacja została wprowadzona stosunkowo niedawno.
W każdym razie zapamiętaj proszę, że typ number obsługuje różne systemy liczbowe.
Poza typem number mamy oczywiście jeszcze string.
Tutaj nie ma teoretycznie większego
zaskoczenia, bo wykorzystujemy go do przechowywania ciągów znaków.
Możemy to robić, wykorzystując pojedyncze lub podwójne apostrofy.
Dodatkowo nic nie stoi na przeszkodzie, abyśmy wykorzystali tutaj temple string.
Jeżeli chodzi o zastosowanie pojedynczych
lub podwójnych apostrofów, nie ma tutaj jakiejś szczególnej rekomendacji.
Sam Microsoft rekomenduje wykorzystanie
podwójnych apostrofów, ale już chociażby style guide Airbnb
rekomenduje wykorzystanie pojedynczych
apostrofów. Także ostatecznie to, na który się zdecydujesz, zależy od Ciebie.
Ja akurat skonfigurowałem ESLint w tak i sposób, aby wykorzystywał apostrofy podwójne.
Jeżeli chodzi o typ string
jest jeszcze jedna rzecz, o której musisz wiedzieć.
Mowa tutaj o string literal types, czyli
inaczej mówiąc możemy precyzyjnie określić jaki string będzie zawierała dana zmienna.
Jak widzisz zdefiniowałem tutaj zmienną, ale
zwróć uwagę, że nie mamy tutaj znaku "=", tylko oznaczenie typu.
Dzięki temu TypeScript będzie sprawdzał czy wewnątrz tej zmiennej
znajduje się właśnie tekst 'holiday20' czy też nie.
Jeżeli stanie się inaczej będzie nas o tym
oczywiście ostrzegał. Akurat string literal types w tej sytuacji sprawdzają się dość
rzadko, natomiast będziemy o tym jeszcze mówić przy okazji tzw.
union types.
Ale na ten moment proszę Cię jeszcze o cierpliwość.
Tymczasem może zastanawiasz się dlaczego TypeScript nie wyrzuca nam błędu już tutaj.
W końcu zmienne deklarowane słowem
kluczowym let, inicjalizowane są wartością
undefined. No i faktycznie jest to prawda,
przy czym TypeScript zabezpiecza się na to w następujący sposób: po prostu nie daje nam
możliwości odczytania wartości tej zmiennej, dopóki jej nie określimy.
Jak widzisz mówi o tym dokładnie ten komunikat.
Jeżeli chodzi o typ string na ten moment jest to wszystko i możemy iść dalej.
Następnym w kolejce jest typ boolean, czyli
typ w którym zawierają się wartości true i false.
Akurat tutaj nie mam nic więcej do dodania poza tym, że ten typ wykorzystujemy do
określenia wartości zwracanych przez funkcję.
Ale o tym będziemy mówić przy okazji samych funkcji.
W tej chwili dziękuję Ci za uwagę i do usłyszenia za chwilę.
https://github.com/airbnb/javascript#strings
https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html
String type · 4 min
// String
const single: string = '' /*?*/
const double: string = "double" /*?*/
const ticks: string = `${double} ticks` /*?*/
let coupon: 'holiday20'
console.log(coupon)
coupon = 'summer10'Number type · 2 min
// Number
let counter: number = 10
counter += 1 /*?*/
counter += 1 /*?*/
counter = "0" /*?*/
const PI: number = 3.14 /*?*/
const hex: number = 0xf /*?*/
const bin: number = 0b10100 /*?*/