Podstawy
1 godz. 31 min · Typescript · Full-stack i Programowanie
Adam GospodarczykTypeScript umożliwia opisanie naszego kodu typami oraz wychwytywanie dotyczących ich błędów na wczesnym etapie developmentu. W efekcie wykorzystanie TypeScript'u w projekcie podnosi jego jakość i zmniejsza ryzyko pomyłek, które mogą być nie wychwycone na etapie testowania lub mogą pojawić się dopiero w środowisku produkcyjnym.
Z pomocą Reacta tworzymy coraz bardziej złożone aplikacje w których ryzyko popełnienia błędów jest wysokie. TypeScript nie tylko je zmniejsza ale również wpływa pozytywnie na tzw. developer experience (doświadczenia programisty) poprzez to, że nasze IDE "wie więcej" na temat kodu który piszemy. A to z kolei przekłada się na lepszą wydajność i komfort pracy.
Przy założeniu że znamy już samego Reacta oraz TypeScript, połączenie tych dwóch umiejętności jest stosunkowo proste. Wystarczy poznać ogólne zasady typowania propsów, komponentów oraz hooków aby z powodzeniem móc wykorzystywać zalety płynące z posiadania typów w naszym kodzie. W tym kursie dowiesz się jak to zrobić, w najszybszy możliwy sposób.
Kurs został przygotowany tak aby na prostych przykładach pokazać Ci w jaki sposób wykorzystywać TypeScript w projektach React.js. Jeżeli szukasz źródła które pozwoli Ci szybko zacząć - jesteś w dobrym miejscu.
Materiał zawiera dobre praktyki i sugestie dotyczące wykorzystania TypeScript'u oraz konfiguracji środowiska pracy (np. IDE) oraz ustawień samego projektu. Jest to wiedza którą możesz wykorzystać również w przypadku pracy z innymi technologiami.
Kurs został przygotowany z myślą o osobach, które znają już React oraz TypeScript i chcą dowiedzieć się w jaki sposób połączyć te umiejętności. Materiał niemal całkowicie pomija informacje na temat mechanizmów Reacta oraz TypeScript'u. Jeżeli potrzebujesz poszerzyć swoją wiedzę na ich temat, zapraszamy Cię do naszych pozostałych kursów.
W tym momencie przechodzimy już do wykorzystania skryptów reakcję i zaczniemy
od tego, w jaki sposób możemy typować propsy komponentów.
Mamy tutaj konfigurację naszej aplikacji i
wewnątrz pliku SPC utworzymy sobie katalog components i wewnątrz niego utworzymy
sobie nowy komponent o nazwie Used List PSX.
No i teraz interesuje nas to, aby utworzyć
faktycznie ten komponent z jakąś podstawową zawartością.
I tutaj jeszcze aby wszystko było w porządku musimy zaimportować jako element
i o typować i konkretnie oznaczyć co dokładnie zwraca nam ta funkcja.
Oczywiście normalnie nie musimy tego robić, ponieważ skrypt sam jest w stanie
się tego domyślić, natomiast w tym przypadku wymaga tego od nas link.
Oczywiście nic nie stoi na przeszkodzie, aby po prostu tą opcję wyłączyć.
Z tego powodu skopiuję ją teraz i
przejdziemy do pliku konfiguracyjnego, a następnie ustawimy ją na wyłączoną.
W ten sposób nasz błąd zniknie i nie
będziemy musieli dodawać tutaj czegoś, czego faktycznie być nie musi.
No i teraz wyobraźmy sobie, że zamiast
elementu Eli będziemy wyświetlać tutaj lista użytkowników.
Sam użytkownik będzie dodatkowym
komponentem, który zdefiniujemy sobie tutaj.
I aby to wszystko działało teraz
poprawnie, musimy określić dokładnie, jakie propsy są tutaj przyjmowane.
W tym momencie jest to imię i mail oraz ewentualnie Done.
Od razu widzimy, że mamy tutaj błąd wynikający z tego, że musimy nadać
odpowiednie typy temu poszczególnym właściwością.
Zatem jeżeli chodzi o imię będzie to string.
Jeżeli chodzi o email również.
Natomiast sama tablica będzie tablicą stringów.
W momencie gdy zapisujemy plik wszystko
tutaj działa poprawnie i możemy uzupełnić zawartość naszego komponentu.
Załóżmy, że będzie wyglądać ona następująco.
Jak widzisz mamy tutaj wyświetlenie
imienia, adresu email oraz wylosowanych ról z tego użytkownika.
Zatem w ten sposób dodaliśmy typy do naszych props.
Natomiast muszę przyznać, że jest to dość
mało czytelne i zdecydowanie nie polecam robić tego w ten sposób, no może
wyłączając naprawdę pojedyncze przypadki bardzo prostych komponentów.
Zdecydowanie lepiej jest wykorzystać tutaj
interfejs I od razu tutaj zaznaczę, że jeżeli chodzi o nazwy interfejsów w formie
jaką tutaj widzisz, czyli mamy tutaj poszczególne słowa napisane wielkimi
literami oraz sama nazwa interfejsu poprzedzona jest wielką literą i dzięki
temu wiemy, że mamy do czynienia z interfejsem.
Jeżeli chodzi o sam zapis poszczególnych właściwości tego interfejsu, to tak
naprawdę nawet wskazane jest, aby wykorzystywać tutaj komentarze zapisane w
formule Test, dzięki czemu zyskamy tutaj dodatkowe możliwości.
Oczywiście ja teraz zapiszę tutaj
poszczególne właściwości naszego interfejsu, natomiast różnica jaką tutaj
mamy będzie widoczna po najechaniu na konkretną właściwość.
Konkretnie musimy teraz wykorzystać ten nasz interfejs i w momencie gdy mamy nasze
propsy okazuje się, że mamy tutaj również opis tego konkretnego komentarza.
Zatem ja osobiście w większości przypadków
spotykam się z opiniami, że dodawanie komentarzy w kodzie jest raczej
niepożądane i powinniśmy pisać kod tak, abyś zapisywał się sam.
I po części jest to oczywiście prawda.
Natomiast jednocześnie warto uwzględnić,
że w przypadku tego skryptu możemy na tym niesamowicie dużo zyskać.
Oczywiście w tym przypadku może ten
komentarz nie jest absolutnie tutaj wymagany, ale wyobrażam sobie, że w
przypadku niektórych właściwości może okazać się bardzo przydatny.
Zatem tak jak widzisz, jeżeli chodzi o
wykorzystanie procesów, możemy dodać je z pomocą interfejsu bądź aliasu typu.
I oczywiście jeżeli tutaj popełnimy jakiś
błąd i przekażemy niewłaściwy typ, to od razu otrzymujemy konkretną informację.
No i tak samo, jeżeli będziemy chcieli wykorzystać ten komponent ponownie,
no to w tym przypadku IntelliJ jest na tyle mądry, że możemy dodawać poszczególne
właściwości i on dokładnie powie nam, czego się tutaj spodziewa.
Zatem po najechaniu na poszczególne
fragmenty naszego kodu mamy tutaj jasną informacja o tym, co tutaj dokładnie się
dzieje, co jest oczekiwane i jaki ewentualnie błąd tutaj popełniliśmy.
Jeżeli chodzi o komponenty funkcyjne, to trzeba wspomnieć, że są to tak naprawdę
zwykłe funkcje zwracające element geje sex lub null.
Natomiast co ciekawe, w momencie gdy nie
dodamy w tym przypadku żadnego typu do naszej funkcji, rzeczywiście taki skrypt
jest w stanie domyślić się, że mamy do czynienia z komponentem React.
Natomiast nic nie stoi na przeszkodzie,
abyśmy wykorzystali tutaj komponent o nazwie FC.
Konkretnie jest to typ pochodzący jak
widzisz bezpośrednio z samego DI, jak i w momencie gdy go importujemy.
Możemy przekazać propsy w następujący sposób.
Czyli zamiast robić to tutaj, przekazujemy je do genetyka.
W ten sposób otrzymaliśmy tutaj jeszcze
dodatkowe błędy, ale one pochodzą akurat nie z taksówek tu, tylko z S.
Linda, informujące nas o tym, że nie dokonaliśmy tutaj walidacji procesów.
W tym momencie możemy albo zignorować te
linie lub ewentualnie dodać je do naszego pliku konfiguracyjnego.
W każdym razie wracając do tej, to
typowanie komponentu funkcyjnego w taki sposób ma pewne zaletę, ale również wadę.
Okazuje się, że jeżeli wykorzystamy tutaj
proxy filtrem, no to nagle okaże się, że posiada on określony typ.
I nie otrzymujemy tutaj błędu pochodzącego z sufitu.
Oznacza to, że typ tej właściwości został
tutaj nadany właśnie ze względu na to, że wykorzystaliśmy tutaj typ FC.
Oczywiście nic nie stoi na przeszkodzie,
abyśmy po prostu określili, że mamy tutaj do czynienia ze string
I swoją drogą od razu ta informacja jak widzisz tutaj się zmienia.
Natomiast znowu jest to coś, o czym trzeba będzie pamiętać i z tego względu wiele
osób preferuje ten wcześniejszy zapis jeżeli chodzi o typowanie.
Natomiast z drugiej strony jak widzisz w momencie gdy nie będę wykorzystywał tego
zapisu, to tutaj informacje o tych typach poszczególnych procesów wyświetlane
bezpośrednio w moim edytorze po prostu zniknęły.
One dalej są dostępne w momencie, gdy sobie na nie jedziemy.
Natomiast tamta opcja może okazać się dla Ciebie bardziej czytelna.
Znowu jest to kwestia preferencji i raczej
poza tym co powiedziałem, nie ma różnicy pomiędzy jednym a drugim zapisem.
Ostatnią rzeczą, o której chciałbym tutaj
wspomnieć jest fakt wykorzystania właściwości opcjonalnych.
Usunę sobie teraz tą właściwość filtrem i załóżmy, że przykładowo chcielibyśmy,
aby właściwość Walls była ustawiona jako opcjonalna.
W tej sytuacji w momencie gdy jej tutaj
nie podamy, rzeczywiście nasze błędy znikają.
Natomiast szybko okazuje się, że mamy
tutaj ostrzeżenie, że ten obiekt może być ustawiony jako undefined.
Ale na szczęście znowu nic nie stoi na przeszkodzie, abyśmy wykorzystali tutaj
możliwość ustawiania domyślnych wartości dla parametru funkcji.
Dzięki temu mamy tutaj początkowo pustą tablicę.
Wszystkie błędy znikają, ponieważ
faktycznie typy nam się zgadzają i nie ma możliwości wystąpienia błędu.
Zatem jak widzisz, w momencie, gdy mamy do czynienia z opcjonalnym procesami,
to zdecydowanie warto pamiętać jeszcze o tym, aby ustawić ich domyślne wartości.
Oczywiście ewentualnie moglibyśmy
zastosować tutaj jakiegoś IFA i też wszystko byłoby w porządku.
Natomiast to znowu zależy od sytuacji, w której się znajdujemy.
Jeżeli chodzi o wprowadzenie do typowania
wzorców, to byłoby już na tyle, więc słyszymy się za chwilę w kolejnej lekcji.