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+
Powiedzieliśmy sobie, że TypeScript jest rozszerzeniem JavaScriptu.
Pytanie brzmi: na czym to rozszerzenie polega? W praktyce wygląda to tak, że
w naszym kodzie JavaScript pojawia się po prostu dodatkowa składnia.
Bo np. wiemy już, że TypeScript umożliwia nam
statyczne typowanie, czyli po prostu mamy możliwość określenia typu zmiennych.
Jak widzisz wygląda to następująco. Mamy
tutaj deklarację poszczególnych zmiennych oraz po dwukropku podajemy ich typ. I właśnie
dzięki temu już na etapie kodu wiemy, że do zmiennej text możemy przypisać string, ale
próba przypisania do niej liczby zakończy się błędem.
Podobnie określenie typu możemy zastosować w przypadku tablic np.
taki zapis również nie jest charakterystyczny dla JavaScript.
Ale jak widzisz mamy tutaj informację o tym, że w zmiennej list znajduje się
tablica, przechowująca elementy typu number.
Akurat w przypadku tablic to samo możemy zapisać jeszcze w ten sposób.
Pomiędzy tymi zapisami nie ma jakiejś szczególnej różnicy,
poza małymi wyjątkami, które omówimy przy okazji lekcji o tablicach.
W każdym razie określenie typu elementów tablicy również chroni nas przed tym, aby
nie trafiły do niej elementy typu, którego się nie spodziewamy.
Zatem jak widzisz próba dodania tekstu do
tablicy list została zaznaczona jako błąd i to oczywiście jest prawdą.
Idąc dalej, typy mogą dotyczyć również
funkcji a konkretniej ich parametrów oraz zwracanych przez nie wartości.
W tej sytuacji funkcja play jako pierwszy
argument przyjmuje string a zwraca wartość logiczną.
Oczywiście o funkcjach będziemy sobie jeszcze rozmawiać, ale zobaczmy jak działa ta.
Ponownie jak widzisz mamy tutaj błąd, ponieważ próbowałem przekazać do niej
obiekt. Ale już w momencie gdy przekażę do niej string, wszystko będzie w porządku.
Myślę, że to wszystko jest dla Ciebie jak najbardziej jasne.
Oczywiście te wszystkie tematy będziemy
pogłębiać w kolejnych lekcjach, natomiast teraz zależy mi na tym, abyś wiedział czego
może się spodziewać. Teraz, zanim przejdziemy dalej, pokażę Ci jeszcze jedną
rzecz. Mianowicie być może zastanawiasz się w jaki sposób ten kod działa.
Tak się składa, że przeglądarki nie potrafią zrozumieć kodu TypeScript.
Natomiast my oczywiście możemy przetłumaczyć TypeScript na JavaScript.
Jak to dokładnie robić będę Ci jeszcze
opowiadał. Na ten moment po prostu zrobię tak. To co teraz się stało to na podstawie
naszego kodu TypeScript wygenerowałem przetłumaczony kod JavaScript.
Jak widzisz tutaj poza tym, że trochę zmieniło się formatowanie,
cała reszta jest teraz normalnym kodem JavaScript, bez dodatkowej składni TypeScript.
Oczywiście w praktyce nie musimy zajmować się ręcznym tłumaczeniem tych wszystkich
plików, bo tym zajmują się narzędzia takie jak chociażby Web Pack.
Proponuję, abyśmy wrócili teraz do tematu
składni w TypeScripcie, ponieważ jest jeszcze kilka rzeczy, które chciałem CI pokazać.
Jedną z nich są interfejsy, które znasz być może z innych języków programowania.
W każdym razie w tej konkretnej sytuacji
określamy kształt jakiegoś obiektu i tym obiektem jest argument funkcji setPosition.
Dzięki temu, w momencie gdy ją wywołujemy,
TypeScript będzie dbał o to aby obiekt, który do niej przekazujemy, miał
odpowiedni zdefiniowany przez nas w interfejsie kształt.
Interfejsy są przykładem składni, która nie występuje naturalnie w JavaScripcie,
przynajmniej nie na moment, w którym nagrywam ten film.
Ale jak widzisz ich zastosowanie jest niesamowicie przydatne, a chyba nie muszę
podkreślać, że ten przykład jest naprawdę podstawowy.
Kolejnym przykładem, poza interfejsami, są chociażby dekoratory.
A są to specjalne formy deklaracji, które możemy podłączać do np.
klas. Pokażę Ci teraz przykład takiego
dekoratora, ale nie będziemy zgłębiać się w jego kształt.
W każdym razie mam tutaj klasę Member,
która posiada konstruktor oraz właściwość name. I teraz, tworząc obiekt na podstawie
tej klasy, przekazujemy do konstruktora imię użytkownika.
Teoretycznie moglibyśmy się spodziewać, że jeżeli zrobię teraz tak
i dodam tylko, że ten zapis jest charakterystyczny dla wspomnianego
rozszerzenia quokka js, do tego aby wyświetlić wartość zmiennej.
I właśnie wartość tej zmiennej powinna wskazywać na moje imię.
A jak widzisz mamy tutaj jeszcze rakietę.
Stało się to właśnie za pośrednictwem
zdefiniowanego przeze mnie dekoratora, który zmodyfikował zachowanie konstruktora.
W TypeScripcie takich elementów jak interfejsy i dekoratory
jest jeszcze kilka, ale będziemy mówić o nich później.
Na koniec mam jeszcze jeden przykład,
który pokazuje jak zaawansowany może być TypeScript. To co tutaj widzisz to przykład pochodzący
bezpośrednio z dokumentacji i jest to jak najbardziej poprawny kod TypeScript.
Jednocześnie trudno byłoby o nim
powiedzieć, że ma cokolwiek wspólnego z JavaScriptem.
Ale na zrozumienie tej całej składni przyjdzie jeszcze czas.
Tymczasem to tyle jeżeli chodzi o wstęp. To co musisz zapamiętać z tej lekcji to fakt,
że TypeScript daje nam dodatkowe możliwości, rozszerzając składnię JavaScriptu.
Jednocześnie przypominam o tym, że
ostatecznie ta składnia musi być przetranspilowana do czystego JavaScriptu.
I właśnie tym wszystkim będziemy zajmować się w tym kursie.
Typy zmiennych · 1 min
// Variable types
let counter: number;
let text: string;
let logic: boolean;
text = 'Lorem ipsum';Typy tablic · 1 min
// Arrays
let list: number[] = [1, 2, 3];
let list2: Array<number> = [1, 2, 3];Typy funkcji · 2 min
// Functions
const play = function (song: string): boolean {
console.log(`Playing ${song}`);
return true;
}Interfejsy · 3 min
// Interfaces
interface Coords { x: number, y: number }
function setPosition(position: Coords) {
return `Current position is set to: ${position}`
}
setPosition({ x: 1, y: 3});Dekoratory · 4 min
// Decorators
function Rocket() {
return function(target: any, key: string | symbol) {
let value = target[key];
const getter = () => value;
const setter = (next: string) => {
value = `${next} 🚀`
}
Object.defineProperty(target, key, {
get: getter, set: setter, enumerable: true, configurable: true
});
};
}
class Member {
@Rocket()
public name: string
constructor(name: string) {
this.name = name
}
}