Techniki Zaawansowane
2 godz. 35 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.
TypeScript umożliwia stosunkowo prostą migrację istniejących projektów JavaScript. W kursie na przykładzie zostały omówione trzy strategie, dzięki którym jesteśmy w stanie dodać statyczne typowanie do istniejącego kodu. W procesie migracji najważniejsze jest to, że przepisywanie kodu jesteśmy w stanie uzależnić również od poziomu naszej wiedzy na temat TypeScriptu i stopniowo dodawać kolejne elementy.
Na pierwszy rzut oka można uznać, że TypeScript tylko dodaje nam pracy, wymuszając dodatkową konfigurację oraz opisywanie typów. Mało tego zwiększa barierę wejścia w projekt dla mniej doświadczonych programistów. Trudno temu zaprzeczyć ALE - korzyści płynące ze statycznego typowania które wpływają na zmniejszenie liczby błędów oraz wykrywanie ich nawet na poziomie pisania kodu, oszczędzają czas który normalnie poświęcilibyśmy na późniejsze debugowanie aplikacji. Poza tym zwiększenie stabilności aplikacji daje szerokie korzyści biznesowe, które wielokrotnie wynagradzają nam czas wymagany na pisanie dodatkowej składni.
JavaScript jest językiem dynamicznie typowanym. W trakcie wykonywania programu, zmienne mogą zmieniać swój typ a my nie zawsze mamy nad tym świadomą kontrolę. Tylko ... po co nam ta kontrola? Główną zaletą statycznego typowania jest to aby uniknąć sytuacji w których przypadkowo przypisujemy tekst do zmiennej która powinna zawierać liczbę lub sytuacji w której przekazujemy do funkcji nieprawidłowe dane. Taki rodzaj pomyłek generuje błędy odniesienia (eng. ReferenceError), które zatrzymują działanie skryptu i są momentami bardzo uciążliwe do wykrycia. Dzięki statycznemu typowaniu, jesteśmy w stanie wykrywać je na etapie pisania kodu.
TypeScript na przestrzeni ostatnich lat zyskuje ogromną popularność w społeczności programistów JavaScript i coraz częściej jest nieodłącznym elementem ofert o pracę. W przypadku firm nastawionych na rozwój rozbudowanych aplikacji JavaScript już teraz jest w zasadzie standardem. Biorąc pod uwagę fakt, że najnowsze frameworki (np. Nest.js) wykorzystują TypeScript domyślnie, nauka tej technologii ma ogromny sens w kontekście rozwoju jako programista. I ostatnim argumentem za tym aby wziąć TypeScript na poważnie jest to, że stoi za nim firma Microsoft a on sam rozwijany jest już niemal 10 lat.
Ten kurs został stworzony z myślą o programistach, którzy podstawy TypeScriptu mają już za sobą i chcą poznać jego zaawansowane techniki. Aby w pełni wykorzystać wiedzę z tego kursu, niezbędna jest również zaawansowana znajomość JavaScriptu a w szczególności jego elementów prowadzonych w wersji ES6+. Zdecydowanie polecamy przerobienie kursu Podstawowego TypeScript, który znajdziesz na eduweb, przed korzystaniem z tego materiału.
3.9+
W tej lekcji pokażę ci w jaki sposób możesz uwzględniać oraz wykluczać
pliki oraz katalogi z kompilacji twojego projektu typescript w
poprzedniej lekcji powiedziałem ci o trzech właściwościach które umieszczamy w pliku tsconfig
które odpowiadają właśnie za dodawanie oraz wykluczanie
zarówno plików jak i katalogów ich nazwy są wystarczająco
opisowe do tego aby domyślić się że właściwość files pozwala nam
przekazać tablice plików które mają zostać uwzględnione w procesie kompilacji
zatem jeżeli teraz kompiluję nasz projekt to tutaj
zwróć uwagę że w pliku app.ts mam zwykły console.log który
został przeniesiony do pliku app.js i w zasadzie w żaden sposób się
tutaj nie zmienił natomiast nie zmienia to faktu że plik został uwzględniony
oczywiście nic nie stoi na przeszkodzie abyśmy w tym miejscu
podali wiele różnych plików natomiast w momencie gdy znajdują się one w poszczególnych
katalogach zdecydowanie lepszym pomysłem jest wykorzystanie tych właściwości
no i tutaj sytuacja wygląda następująco aby
jednak pokazać ci działanie tych właściwości muszę utworzyć nowe katalogi oraz
pliki pierwszym z nich będzie katalog excluded oraz plik o takiej samej nazwie
umieszczony w katalogu src wewnątrz
niego również zamieścimy prosty console.log następnie utworzę drugi
katalog który tym razem będzie miał nazwę included dzięki
temu będziemy teraz mieć możliwość odróżnienia tych plików wracając
do was do pliku app.ts mogę tutaj podać poszczególne ściężki do plików
i teraz w momencie gdy podam tutaj ścieżkę do naszego katalogu w
momencie gdy zapiszę plik oraz skompiluję projekt chyba nikogo nie zaskoczy
fakt że cała zawartość katalogu included została dodana do
naszego skomplikowanego projekt okazuje się jednak że na tym etapie bardzo
dobrą praktyką jest określanie rozszerzeń plików które mają zostać uwzględnione
w procesie kompilacji wynika to z faktu że wewnątrz tego katalogu możemy
mieć pliki które niekoniecznie muszą znaleźć się w bildzie produkcyjnym
dlatego też jak widzisz określam tutaj gwiazdkę która oznacza
dowolną nazwę pliku oraz rozszerzenie ts ale chciałbym zwrócić
twoją uwagę na jeden ważny fakt w momencie gdy usunę teraz podkatalog
i ponownie skompiluję nasz projekt nagle okaże się że nasze
pliki nie zostały uwzględnione wynika to z faktu że faktycznie
wskazaliśmy tutaj podkatalog natomiast w ten sposób powiedzieliśmy że
w procesie kompilacji mają zostać uwzględnione wyłącznie te pliki które
znajdują się bezpośrednio w katalogu src więc teraz pytanie
brzmi co możemy zrobić gdy mamy zagnieżdżoną strukturę katalogów przecież
zdecydowanie chcemy uniknąć podawania tutaj poszczególnych katalogów za każdym
razem aby to wszystko działo się automatycznie możemy tutaj dodać
następujący zapis oznacza on mniej więcej tyle że w procesie kompilacji
zostaną uwzględnione wszystkie pliki z rozszerzeniem ts które znajdują
się w katalogu src oraz w dowolnym jego podkatalogu
dlatego jeżeli teraz ponownie skompiluję nasz projekt wszystko
będzie tutaj w porządku no i jak widzisz zostały tutaj
uwzględnione zarówno katalogi included jak i excluded aby teraz
wykluczyć katalog excluded z naszej kompilacji możemy tutaj podać
bezpośrednio nazwę tego katalogu dzięki temu jeżeli
teraz ponownie wygenerujemy nasz projekt no to zwróć
uwagę że został uwzględniony katalog included natomiast katalog
excluded został pominięty wynika to z faktu że właściwość excluded
jest bardziej priorytetowa niż właściwość incuded ale już w momencie gdybym
podał konkretną ścieżkę do naszego piku w katalogu excluded to
nawet pomimo tego że katalog excluded jest tutaj wykluczony no to
w momencie kompilacji projektu plik ten zostałby uwzględniony naturalnie
w takiej sytuacji w momencie gdyby znajdowały się tutaj inne pliki zostałyby
całkowicie pominięte to co jeszcze na tym etapie mogłoby cię tutaj
zainteresować to znak zapytania konkretnie podając
wartość do naszych tablic możemy tutaj wykorzystać znaki zapytania które
oznaczają dowolny znak zatem takie wzorce pasują zarówno do
katalogu included jaki i excluded więc jeżeli teraz znowu wygeneruję
nasz projekt no jak myślisz co się stanie dam
ci teraz chwilę na zastanowienie no i już generujemy
projekt mam
nadzieję że fakt że katalog excluded został tutaj uwzględniony nie jest
dla ciebie zaskoczeniem no bo zwróć uwagę że zarówno jeden
jak i drugi wzorzec pasują nam zarówno do katalogów excluded oraz included
wiemy już że właściwości excluded ma priorytet nad właściwością
included zatem teoretycznie oba katalogi powinny zostać wykluczone
ale wiemy też że w momencie gdy podajemy tutaj bezpośrednią nazwę do
pliku no to zostaje on uwzględniony nawet w sytuacji gdy jego
katalog jest wykluczony w związku z tym efekt jaki otrzymaliśmy tutaj
uwzględnia katalog excluded oraz oczywiście plik app.ts który
został podany tutaj no i to by było na tyle jeżeli chodzi o dodawanie
oraz wykluczanie plików oraz katalogów z kompilacji projektu typescript
teraz dziękuję ci za uwagę i serdecznie zapraszam cię
do kolejnej lekcji
User Class · 2 min
class User {
name: string;
add() {
return function(this: User) {
return this.name;
};
}Strict Bind Call Apply · 4 min
function iWillNever(message: string, total: number): string {
// Array.from(document.querySelectorAll('span'));
return message.repeat(total);
}
iWillNever('I will not tell lies', 100);
iWillNever.apply(undefined, ['I will not tell lies', 100]);Strict Function Types · 6 min
type getYear = (date: string | number) => void;
function getCurrentYear(callback: getYear) {
callback((Math.random() > 0.5) ? '2020' : 2020);
}
getCurrentYear((date: string) => {
console.log(date.charAt(0));
});Strict Options · 9 min
// "noImplicitAny": true,
// "noImplicitThis": true,
// "alwaysStrict": true,
// "strictBindCallApply": true,
// "strictFunctionTypes": true,
// "strictPropertyInitialization": true,
// "strictNullChecks": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,