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+
Interfejsy w TS sprawdzają się w wielu różnych kontekstach.
Jednym z takich kontekstów są funkcje.
Zacznijmy od zdefiniowania obiektu, który
można odtworzyć, ale jest to opcjonalne. Czyli jak widzisz mam tutaj metodę, która
zwraca String, ale nie musi być wcale obecna w tym obiekcie.
Następnie potrzebuję funkcji, która będzie uruchamiać tego typu obiekty.
Więc tutaj również definiuję interfejs, ale już tutaj określam to jak będzie wyglądać
nasza funkcja, czyli będzie przyjmować ona parametr
media typu Playable a następnie zwracać string.
Taki interfejs bezpośrednio mogę dołączyć
do funkcji. Najpierw tworzę tutaj zmienną a następnie przypisuje do niej funkcję.
Funkcja ta musi być zgodna z naszym
interfejsem, dlatego też musimy ustawić odpowiedni typ parametru oraz wartości,
którą będzie zwracać. Teraz wewnątrz tej funkcji musimy
obsłużyć sytuację, w której przekazany obiekt nie będzie posiadał metody Play.
Dlatego tworzę tutaj prostego if'a
sprawdzającego czy taka właściwość się znajduje
i jeżeli tak to uruchamiam metodę
a w przeciwnym razie zwracam stosowny komunikat.
No to tak przygotowaną funkcję możemy
teraz wykorzystać, ale potrzebujemy utworzyć obiekt.
Obiekt ten będzie typu Playable i będzie zawierał dwie właściwości.
Zgodnie z tym co określiliśmy w naszym
interfejsie. I tak przygotowany obiekt po prostu mogę przekazać do naszej funkcji.
Jak widzisz faktycznie wszystko tutaj działa.
I mało tego jeżeli nawet przekażę obiekt,
który nie będzie posiadał tej metody to nadal wszystko będzie w porządku.
Jeżeli jednak przekazany obiekt nie będzie
posiadał właściwości name no to już na tym etapie mamy tutaj problem.
Także jak widzisz w kontekście funkcji interfejsy możemy stosować do tego, aby
określać strukturę parametrów, które przyjmuje ta funkcja
czy nawet do określenia całej struktury naszej funkcji.
Oczywiście jak sam zresztą widzisz podobne
rzeczy osiągnęliśmy z wykorzystaniem aliasów, ale zgodnie z tym co powiedziałem
w poprzedniej lekcji, interfejsy dają nam nieco inne,
w niektórych przypadkach lepsze możliwości.
I teraz w tym przykładzie nie pasuje mi jeszcze tylko jedna rzecz.
Wewnątrz tego obiektu musiałem określić wygląd metody Play.
Oczywiście jeżeli miałbym kilka takich
obiektów tego typu zabieg nie byłby wygodny w związku z tym lepiej tutaj
utworzyć klasę. No i tym właśnie zajmiemy się w kolejnej lekcji oraz przyjrzymy się
temu jak interfejsy zachowują się w kontekście klas.
Tymczasem dziękuję Ci za uwagę i do usłyszenia za chwilę.
Playable Interaface · 1 min
interface Playable {
name: string
play?(): string
}Play Interface · 1 min
interface Play {
(media: Playable): string
}Play Media · 1 min
let playMedia: Play
playMedia = function play(media: Playable): string {
if (media.play) {
return media.play()
}
return `Can't play ${media.name}`
}Playable · 1 min
const movie: Playable = {
name: "Lord of the Rings",
play() {
return `Playing ${this.name}`
},
}
playMedia(movie) /*?*/