Średni · lekcja 6
TypeScript — podstawy języka: typy, interfejsy i klasy
Angular pisze się w TypeScript, więc zanim zbudujesz cokolwiek poważniejszego niż jeden przycisk, musisz poznać ten język. Dobra wiadomość: jeśli znasz C#, TypeScript będzie Ci się wydawał bardzo znajomy — silne typowanie, klasy, interfejsy — to te same koncep...
Zacznij tutaj
Po co się tego uczymy?
Wprowadzenie
Teoria
Czym jest TypeScript? To język stworzony przez Microsoft jako NADZBIÓR JavaScriptu — każdy poprawny kod JavaScript jest jednocześnie poprawnym kodem TypeScript, ale TypeScript DODAJE do niego system typów (podobny do tego, co znasz z C#) i inne udogodnienia (interfejsy, klasy w nowoczesnym stylu, generyki). Przeglądarki NIE rozumieją TypeScriptu bezpośrednio — kod .ts jest KOMPILOWANY (a właściwie "transpilowany") do zwykłego JavaScriptu, zanim trafi do przeglądarki. Ten proces dzieje się automatycznie w tle, gdy uruchamiasz projekt Angular.
Dlaczego typy są tak ważne? W zwykłym JavaScript zmienna może w jednej linijce być liczbą, a w następnej stringiem — co prowadzi do trudnych do wyśledzenia błędów. TypeScript pozwala zadeklarować, JAKIEGO typu jest dana zmienna, i zgłasza błąd KOMPILACJI (czyli ZANIM program się uruchomi), jeśli spróbujesz przypisać niewłaściwą wartość — dokładnie ta sama korzyść, którą daje silne typowanie w C#.
| Konstrukcja TypeScript | Odpowiednik w C# | Przykład |
|---|---|---|
let x: number = 5; | int x = 5; (choć TS ma tylko jeden typ liczbowy) | liczby całkowite i zmiennoprzecinkowe to w TS TEN SAM typ number |
let s: string = "cześć"; | string s = "cześć"; | teksty |
let czyGotowe: boolean = true; | bool czyGotowe = true; | wartości logiczne |
let lista: number[] = [1, 2, 3]; | List<int> lista = new() {1,2,3}; | tablice/listy |
interface Produkt { nazwa: string; cena: number; } | podobne do klasy z samymi właściwościami (bez logiki) | opis KSZTAŁTU obiektu, bez implementacji |
class Produkt { ... } | class Produkt { ... } | klasa z polami I metodami — bardzo podobna składnia do C# |
function suma(a: number, b: number): number { ... } | int Suma(int a, int b) { ... } | funkcja z typowanymi parametrami i typem zwracanym |
Interfejsy — opis "kształtu" danych. W TypeScript interfejs (interface) opisuje, JAKIE właściwości musi mieć obiekt, bez definiowania żadnej logiki — bardzo przydatne do opisania struktury danych przychodzących z backendu (np. odpowiedzi JSON z Web API C#, pełne omówienie w lekcji 12). To trochę jak model danych z C# (klasa z samymi właściwościami), tylko bez potrzeby tworzenia instancji przez new.
Typy opcjonalne i null. Znak zapytania po nazwie właściwości (cena?: number) oznacza, że ta właściwość jest OPCJONALNA (może nie istnieć w ogóle) — podobna koncepcja do double? w C#, choć techniczne działanie różni się w szczegółach.
Konfiguracja kompilatora — plik tsconfig.json. Określa, jak ściśle TypeScript sprawdza typy, do jakiej wersji JavaScriptu kompiluje kod, i inne ustawienia — w projektach Angular jest generowany automatycznie przez Angular CLI, zwykle nie trzeba go ręcznie modyfikować na początku nauki.
Zobacz zależności
Schemat
Plik .ts (TypeScript, pisany przez programistę)
│
│ kompilator TypeScript (tsc), uruchamiany automatycznie
│ przez Angular CLI (ng serve / ng build)
▼
Plik .js (zwykły JavaScript, zrozumiały dla przeglądarki)
│
▼
Wykonanie w przeglądarce użytkownika
Sprawdzanie typów - PRZED uruchomieniem:
let cena: number = "sto złotych"; ← BŁĄD KOMPILACJI, wykryty od razu
(string przypisany do number)
interface Produkt { class Produkt { (dla porównania: C#)
nazwa: string; public string Nazwa {get;set;}
cena: number; public double Cena {get;set;}
} }
(tylko OPIS kształtu danych) (klasa z polami i metodami)
Połącz z praktyką
Przykład z życia
Formularz rejestracji w aplikacji Angular oczekuje, że pole "wiek" będzie liczbą — dzięki TypeScript, próba przypisania do niego tekstu (np. przez błąd w kodzie, nie przez użytkownika — to inny temat, walidacja formularzy) zostanie wykryta ZANIM aplikacja w ogóle zostanie uruchomiona, a nie dopiero w trakcie działania u klienta, gdzie błąd byłby dużo trudniejszy do namierzenia.