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+
Przechodzimy teraz do kolejnego tematu jakim są klasy.
One same są już dostępne w JavaScripcie i jak zapewne wiesz pełnią rolę tzw.
Syntactic Sugar dla składni konstruktorów oraz prototypów.
To co jest jednak istotne to fakt, że
TypeScript dodaje do nich kilka użytecznych rzeczy,
na które w samym JavaScripcie będziemy musieli
jeszcze poczekać. Ale zanim Ci to wszystko pokaże zacznijmy sobie od małej powtórki.
Zacznijmy od tego że po zdefiniowaniu
funkcji w JavaScripcie możemy ją po prostu wywołać.
W tym konkretnym przypadku niczego wprost
nie zwracamy z tej funkcji, zatem otrzymujemy wartość udefined.
Natomiast do naszej dyspozycji jest
również słowo kluczowe new, które umożliwia wywołanie tej funkcji jako konstruktora.
Wtedy otrzymujemy tutaj jak widzisz nową instancję obiektu movie.
Teraz nic nie stoi na przeszkodzie abyśmy
do tego konstruktora przekazali jakąś wartość.
Może to być np. tytuł filmu.
Następnie możemy przypisać tę wartość jako właściwość tego obiektu.
Teraz taką właściwość oczywiście możemy
odczytywać. I w tym celu przypiszę wywołanie naszego konstruktora do zmiennej
a następnie zobaczmy co mamy wewnątrz tego obiektu.
Oczywiście do samego konstruktora musimy
przekazać tytuł. Faktycznie w naszym obiekcie pojawiła się właściwość title.
Myślę, że nie ma tutaj żadnego zaskoczenia.
Teraz aby ją odczytać moglibyśmy to zrobić
bezpośrednio, ale zrobimy to z pomocą innej właściwości a konkretnie metody, która
będzie zwracać tytuł. Jeżeli ją teraz wywołamy to otrzymamy tytuł filmu.
Problem jednak polega na tym, że metody zapisane w ten sposób są dołączone
bezpośrednio do każdej instancji utworzonego obiektu.
Nie muszę chyba podkreślać, że z punktu
widzenia wydajności ma to ogromne znaczenie.
Może nie w tym przypadku, ale chyba wiesz co mam na myśli.
W każdym razie zdecydowanie lepszym rozwiązaniem jest tutaj wykorzystanie tzw.
prototypu. Czyli jeżeli teraz odwołam
się do naszego konstruktora to mamy tutaj dostęp do właściwości prototype.
Jest to obiekt, do którego możemy przypisywać inne właściwości np.
tą naszą metodę.
Dzięki temu zwróć uwagę, że w naszym
obiekcie znajduje się już tylko właściwość title.
I jest to oczywiście prawda,
natomiast metoda getTitle nadal jest
dla nas dostępna, ponieważ znajduje się w prototypie tego obiektu.
Bez wątpienia składnia, którą tutaj widzisz
jest dość skomplikowana a przecież przykład jest stosunkowo prosty.
Dlatego do naszej dyspozycji mamy teraz
klasy, które zasadniczo robią dokładnie to samo, ale w zdecydowanie prostszy sposób.
Zobaczmy jak ten przykład wygląda w momencie, gdy wykorzystamy tutaj klasy.
Z pomocą nowej składni klasy tworzymy wykorzystując słowo kluczowe class.
Następnie, jak widzisz, nie mamy tutaj na was do których możemy przekazać dane,
ale możemy to zrobić bezpośrednio w konstruktorze.
Konstruktor jest metodą, która jest
uruchamiana w momencie gdy tworzymy instancje tej klasy.
W związku z tym to do niej trafi tytuł
naszego filmu, który musimy do tej klasy jakoś przypisać.
I aby to zrobić musimy dodać właściwość do naszej klasy.
Teraz wystarczy, że przypiszemy przekazaną wartość do naszej właściwości
i osiągniemy w ten sposób taki sam efekt jak mieliśmy przed chwilą.
Teraz aby skorzystać z tej klasy wystarczy,
że utworzy jej nową instancje i robię to dokładnie tak jak robiłem przed chwilą.
Do konstruktora przekazuję oczywiście tytuł naszego filmu.
No i efekt końcowy jest taki sam.
Teraz jeżeli chciałbym dodać kolejną
metodę, czyli getTitle to wystarczy, że zrobię to w taki sposób.
Ta metoda zwraca tytuł filmu, więc oczywiście mamy tutaj string, więc
dodatkowo sygnalizuję, że takich właśnie danych się spodziewamy.
No i teraz, podobnie jak ostatnio, po prostu wywołuje tą metodę na naszym obiekcie.
Zwróć uwagę, że w przeciwieństwie do ostatniego razu pomimo tego, że
zdefiniowałem tę metodę wewnątrz naszej klasy, nie została ona dołączona
bezpośrednio do instancji tego obiektu, tylko trafiła do jego prototypu.
Wynika to po prostu z tego jak działa nowa składnia class.
Swoją drogą możemy to teraz nawet podejrzeć, kompilując ten plik do JavaScriptu.
Zobacz, że mamy tutaj niemal dokładnie taką
samą składnię jak w poprzednim przykładzie.
Metoda getTitle została automatycznie dołączona do prototypu klasy movie.
Nie ma jednak wątpliwości, że ta składnia jest zdecydowanie bardziej czytelna i poza
tym jest to również spójna z tym jak to wygląda w innych językach programowania.
Ostatnią rzeczą, którą chciałbym tutaj poruszyć jest fakt, że w przypadku
konstruktora możemy wykorzystać pewien skrót.
Mianowicie zwróć uwagę, że tutaj, tutaj
oraz tutaj bardzo powtarzamy kod tylko po to, aby ustawić jedną właściwość.
W przypadku TypeScriptu możemy zastosować taki oto skrót, czyli usuwamy tutaj
przypisanie tej właściwości oraz usuwamy samą właściwość.
W tej chwili mam tutaj informację o tym, że ta właściwość nie istnieje, ale wystarczy
że ustawę tę zmienną prywatną i wszystko będzie OK.
O tym co oznacza słowo kluczowe private opowiem Ci już w kolejnej lekcji.
Do usłyszenia za chwilę.
Class syntax · 3 min
// Class Syntax
class Movie {
constructor(private title: string) {}
getTitle(): string {
return this.title
}
}
const bestMovieEver = new Movie("Peaceful Warrior")
bestMovieEver /*?*/
bestMovieEver.getTitle() /*?*/Tworzenie obiektów · 2 min
// Movie() /*?*/
const bestMovieEver = new Movie("Peaceful Warrior") /*?*/
bestMovieEver /*?*/
bestMovieEver.getTitle() /*?*/Function Constructor · 1 min
// Function Constructor Syntax
function Movie(title) {
this.title = title
}
Movie.prototype.getTitle = function () {
return this.title
}