Odkryj przysz艂o艣膰 TypeScript: zaawansowane typy, optymalizacja wydajno艣ci i strategie budowy niezawodnych aplikacji. Mapa do nienaruszalnego bezpiecze艅stwa typ贸w.
TypeScript Quantum Future: Mapa drogowa do niezawodnego bezpiecze艅stwa typ贸w
TypeScript, nadzbi贸r JavaScriptu, zrewolucjonizowa艂 rozw贸j front-endu i back-endu, dodaj膮c statyczne typowanie do dynamicznego 艣wiata JavaScriptu. Jego solidny system typ贸w wcze艣nie wykrywa b艂臋dy, poprawia utrzymywalno艣膰 kodu i zwi臋ksza produktywno艣膰 deweloper贸w. Poniewa偶 TypeScript stale ewoluuje, zrozumienie jego zaawansowanych funkcji i najlepszych praktyk jest kluczowe dla budowania wysokiej jako艣ci, skalowalnych aplikacji. Ten kompleksowy przewodnik zag艂臋bia si臋 w zaawansowane koncepcje, optymalizacje wydajno艣ci i przysz艂e kierunki rozwoju TypeScript, dostarczaj膮c mapy drogowej do osi膮gni臋cia niezawodnego bezpiecze艅stwa typ贸w.
Pot臋ga zaawansowanych typ贸w
Opr贸cz podstawowych typ贸w, takich jak string, number i boolean, TypeScript oferuje bogaty zestaw zaawansowanych typ贸w, kt贸re umo偶liwiaj膮 deweloperom precyzyjne wyra偶anie z艂o偶onych struktur danych i relacji. Opanowanie tych typ贸w jest kluczowe dla odblokowania pe艂nego potencja艂u TypeScript.
Typy warunkowe: logika na poziomie typ贸w
Typy warunkowe pozwalaj膮 definiowa膰 typy w oparciu o warunki, podobnie jak operatory tr贸jargumentowe w JavaScript. Ta pot臋偶na funkcja umo偶liwia tworzenie elastycznych i adaptowalnych definicji typ贸w.
Przyk艂ad:
type IsString<T> = T extends string ? true : false;
type StringCheck = IsString<string>; // type StringCheck = true
type NumberCheck = IsString<number>; // type NumberCheck = false
Wyja艣nienie: Typ IsString wykorzystuje typ warunkowy do sprawdzenia, czy dany typ T rozszerza string. Je艣li tak, typ zostanie rozwi膮zany do true; w przeciwnym razie zostanie rozwi膮zany do false. Ten przyk艂ad demonstruje, jak typy warunkowe mog膮 by膰 u偶ywane do tworzenia logiki na poziomie typ贸w.
Przypadek u偶ycia: Implementacja bezpiecznego typowo pobierania danych w oparciu o kody statusu odpowiedzi API. Na przyk艂ad, r贸偶ne kszta艂ty danych w zale偶no艣ci od statusu sukcesu lub b艂臋du. Pomaga to zapewni膰 prawid艂ow膮 obs艂ug臋 danych w oparciu o odpowiedzi API.
Typy mapowane: 艁atwa transformacja typ贸w
Typy mapowane pozwalaj膮 przekszta艂ca膰 istniej膮ce typy w nowe typy poprzez iterowanie po ich w艂a艣ciwo艣ciach. Jest to szczeg贸lnie przydatne do tworzenia typ贸w narz臋dziowych, kt贸re modyfikuj膮 w艂a艣ciwo艣ci typu obiektu.
Przyk艂ad:
type Readonly<T> = {
readonly [K in keyof T]: T[K];
};
type Person = {
name: string;
age: number;
};
type ReadonlyPerson = Readonly<Person>; // All properties are now readonly
Wyja艣nienie: Typ Readonly jest wbudowanym typem mapowanym, kt贸ry sprawia, 偶e wszystkie w艂a艣ciwo艣ci danego typu s膮 readonly. Sk艂adnia [K in keyof T] iteruje po kluczach typu T, a s艂owo kluczowe readonly sprawia, 偶e ka偶da w艂a艣ciwo艣膰 jest niezmienna.
Przypadek u偶ycia: Tworzenie niezmiennych struktur danych dla paradygmat贸w programowania funkcyjnego. Pomaga to zapobiega膰 przypadkowym modyfikacjom stanu i zapewnia integralno艣膰 danych w aplikacjach.
Typy narz臋dziowe: Szwajcarski scyzoryk TypeScriptu
TypeScript dostarcza zestaw wbudowanych typ贸w narz臋dziowych, kt贸re wykonuj膮 typowe transformacje typ贸w. Typy te mog膮 znacz膮co upro艣ci膰 kod i poprawi膰 bezpiecze艅stwo typ贸w.
Typowe typy narz臋dziowe:
Partial<T>: Sprawia, 偶e wszystkie w艂a艣ciwo艣ciTs膮 opcjonalne.Required<T>: Sprawia, 偶e wszystkie w艂a艣ciwo艣ciTs膮 wymagane.Readonly<T>: Sprawia, 偶e wszystkie w艂a艣ciwo艣ciTs膮 tylko do odczytu (readonly).Pick<T, K>: Tworzy nowy typ, wybieraj膮c zestaw w艂a艣ciwo艣ciKzT.Omit<T, K>: Tworzy nowy typ, pomijaj膮c zestaw w艂a艣ciwo艣ciKzT.Record<K, T>: Tworzy typ z kluczamiKi warto艣ciamiT.
Przyk艂ad:
type User = {
id: number;
name: string;
email?: string;
};
type RequiredUser = Required<User>; // email is now required
type UserWithoutEmail = Omit<User, 'email'>; // email is removed
Przypadek u偶ycia: Obs艂uga danych formularzy, gdzie niekt贸re pola mog膮 by膰 opcjonalne. Partial<T> mo偶e by膰 u偶yty do reprezentowania obiektu danych formularza, a Required<T> do zapewnienia, 偶e wszystkie wymagane pola s膮 obecne przed przes艂aniem formularza. Jest to szczeg贸lnie pomocne w kontekstach mi臋dzynarodowych, gdzie wymagania formularzy mog膮 si臋 r贸偶ni膰 w zale偶no艣ci od lokalizacji lub przepis贸w.
Generyki: Pisanie kodu wielokrotnego u偶ytku z bezpiecze艅stwem typ贸w
Generyki pozwalaj膮 pisa膰 kod, kt贸ry mo偶e wsp贸艂pracowa膰 z r贸偶nymi typami, zachowuj膮c jednocze艣nie bezpiecze艅stwo typ贸w. Jest to kluczowe dla tworzenia komponent贸w i bibliotek wielokrotnego u偶ytku.
Przyk艂ad:
function identity<T>(arg: T): T {
return arg;
}
let myString: string = identity<string>("hello");
let myNumber: number = identity<number>(42);
Wyja艣nienie: Funkcja identity to funkcja generyczna, kt贸ra przyjmuje argument typu T i zwraca t臋 sam膮 warto艣膰. Sk艂adnia <T> deklaruje parametr typu T, kt贸ry mo偶e by膰 dowolnym typem. Podczas wywo艂ywania funkcji mo偶na jawnie okre艣li膰 parametr typu (np. identity<string>) lub pozwoli膰 TypeScriptowi wywnioskowa膰 go na podstawie typu argumentu.
Przypadek u偶ycia: Tworzenie struktur danych wielokrotnego u偶ytku, takich jak listy po艂膮czone lub drzewa, kt贸re mog膮 przechowywa膰 r贸偶ne typy danych, zapewniaj膮c jednocze艣nie bezpiecze艅stwo typ贸w. Rozwa偶my mi臋dzynarodow膮 platform臋 e-commerce. Mo偶na utworzy膰 generyczn膮 funkcj臋 do formatowania waluty w oparciu o ustawienia regionalne, zapewniaj膮c zastosowanie odpowiedniego symbolu waluty i formatowania dla ka偶dego regionu, jednocze艣nie utrzymuj膮c bezpiecze艅stwo typ贸w warto艣ci numerycznych.
Inferencja typ贸w: Pozw贸l TypeScriptowi wykona膰 prac臋
System inferencji typ贸w TypeScript automatycznie wnioskuje typy zmiennych i wyra偶e艅 na podstawie ich u偶ycia. Zmniejsza to potrzeb臋 jawnych adnotacji typ贸w i sprawia, 偶e kod jest bardziej zwi臋z艂y.
Przyk艂ad:
let message = "hello"; // TypeScript infers that message is a string
let count = 42; // TypeScript infers that count is a number
function add(a: number, b: number) {
return a + b; // TypeScript infers that the return type is number
}
Wyja艣nienie: W powy偶szym przyk艂adzie TypeScript wnioskuje typy message, count oraz typ zwracany przez add na podstawie ich warto艣ci pocz膮tkowych i u偶ycia. Zmniejsza to potrzeb臋 jawnych adnotacji typ贸w i sprawia, 偶e kod jest bardziej czytelny.
Przypadek u偶ycia: Praca z interfejsami API, kt贸re zwracaj膮 z艂o偶one struktury danych. TypeScript mo偶e wywnioskowa膰 typy zwr贸conych danych, umo偶liwiaj膮c dost臋p do w艂a艣ciwo艣ci z bezpiecze艅stwem typ贸w bez jawnego definiowania typ贸w. Wyobra藕my sobie aplikacj臋 komunikuj膮c膮 si臋 z globalnym API pogodowym. TypeScript mo偶e automatycznie wywnioskowa膰 typy temperatury, wilgotno艣ci i pr臋dko艣ci wiatru, u艂atwiaj膮c prac臋 z danymi niezale偶nie od regionu.
Stopniowe typowanie: Wdra偶anie TypeScriptu stopniowo
TypeScript wspiera stopniowe typowanie, co pozwala na wprowadzanie TypeScriptu do istniej膮cej bazy kodu JavaScriptu przyrostowo. Jest to szczeg贸lnie przydatne w przypadku du偶ych projekt贸w, gdzie ca艂kowite przepisanie kodu nie jest wykonalne.
Strategie stopniowego typowania:
- Rozpocznij od najbardziej krytycznych cz臋艣ci kodu. Skup si臋 na modu艂ach, kt贸re s膮 cz臋sto modyfikowane lub zawieraj膮 z艂o偶on膮 logik臋.
- U偶ywaj
anyoszcz臋dnie. Chocia偶anypozwala omin膮膰 sprawdzanie typ贸w, nale偶y go u偶ywa膰 z ostro偶no艣ci膮, poniewa偶 niweczy to cel TypeScriptu. - Wykorzystaj pliki deklaracji (
.d.ts). Pliki deklaracji dostarczaj膮 informacji o typach dla istniej膮cych bibliotek i modu艂贸w JavaScript. - Przyjmij sp贸jny styl kodowania. Sp贸jno艣膰 w konwencjach nazewnictwa i strukturze kodu u艂atwia migracj臋 do TypeScriptu.
Przypadek u偶ycia: Du偶e, starsze projekty JavaScript, gdzie ca艂kowita migracja do TypeScriptu jest niepraktyczna. Stopniowe wprowadzanie TypeScriptu pozwala czerpa膰 korzy艣ci z bezpiecze艅stwa typ贸w bez zak艂贸cania istniej膮cej bazy kodu. Na przyk艂ad, mi臋dzynarodowa instytucja finansowa z dziedziczn膮 aplikacj膮 bankow膮 mo偶e stopniowo wprowadza膰 TypeScript do najbardziej krytycznych modu艂贸w, poprawiaj膮c niezawodno艣膰 i 艂atwo艣膰 utrzymania systemu bez konieczno艣ci ca艂kowitej przebudowy.
Optymalizacja wydajno艣ci: Pisanie efektywnego kodu TypeScript
Chocia偶 TypeScript oferuje liczne korzy艣ci, wa偶ne jest, aby pisa膰 efektywny kod, aby unikn膮膰 w膮skich garde艂 wydajno艣ci. Oto kilka wskaz贸wek dotycz膮cych optymalizacji kodu TypeScript:
- Unikaj zb臋dnych asercji typ贸w. Asercje typ贸w mog膮 omija膰 sprawdzanie typ贸w i prowadzi膰 do b艂臋d贸w wykonawczych.
- U偶ywaj interfejs贸w zamiast alias贸w typ贸w dla typ贸w obiektowych. Interfejsy s膮 generalnie bardziej wydajne ni偶 aliasy typ贸w dla z艂o偶onych typ贸w obiektowych.
- Minimalizuj u偶ycie
any. U偶ycieanywy艂膮cza sprawdzanie typ贸w i mo偶e wprowadza膰 b艂臋dy wykonawcze. - Zoptymalizuj proces kompilacji. U偶yj kompilacji przyrostowej i buforowania, aby przyspieszy膰 proces budowania.
- Profiluj sw贸j kod. U偶yj narz臋dzi profiluj膮cych, aby zidentyfikowa膰 w膮skie gard艂a wydajno艣ci i odpowiednio zoptymalizowa膰 kod.
Przyk艂ad: Zamiast u偶ywa膰 type MyType = { a: number; b: string; }, preferuj interface MyType { a: number; b: string; } dla lepszej wydajno艣ci, zw艂aszcza przy pracy z du偶ymi, z艂o偶onymi typami obiektowymi.
Przypadek u偶ycia: Aplikacje wymagaj膮ce wysokiej wydajno艣ci, takie jak przetwarzanie danych w czasie rzeczywistym lub renderowanie grafiki. Optymalizacja kodu TypeScript zapewnia p艂ynne i efektywne dzia艂anie aplikacji. Rozwa偶my globaln膮 platform臋 handlow膮, kt贸ra musi przetwarza膰 du偶e ilo艣ci danych finansowych w czasie rzeczywistym. Wydajny kod TypeScript jest niezb臋dny do zapewnienia, 偶e platforma poradzi sobie z obci膮偶eniem bez problem贸w z wydajno艣ci膮. Profilowanie i optymalizacja mog膮 zidentyfikowa膰 w膮skie gard艂a i poprawi膰 og贸ln膮 wydajno艣膰 systemu.
Wzorce projektowe i architektura: Budowanie skalowalnych aplikacji TypeScript
Przyj臋cie dobrze ugruntowanych wzorc贸w projektowych i zasad architektonicznych jest kluczowe dla budowania skalowalnych i 艂atwych w utrzymaniu aplikacji TypeScript. Oto kilka kluczowych kwestii:
- Modu艂owo艣膰: Podziel swoj膮 aplikacj臋 na ma艂e, niezale偶ne modu艂y, kt贸re mog膮 by膰 rozwijane i testowane niezale偶nie.
- Wstrzykiwanie zale偶no艣ci (Dependency Injection): U偶yj wstrzykiwania zale偶no艣ci do zarz膮dzania zale偶no艣ciami mi臋dzy modu艂ami i poprawy testowalno艣ci.
- Zasady SOLID: Post臋puj zgodnie z zasadami SOLID projektowania obiektowego, aby tworzy膰 elastyczny i 艂atwy w utrzymaniu kod.
- Architektura mikroserwis贸w: Rozwa偶 u偶ycie architektury mikroserwis贸w dla du偶ych, z艂o偶onych aplikacji.
Przyk艂ad: U偶ycie wzorca Obserwator do implementacji aktualizacji w czasie rzeczywistym w aplikacji internetowej. Ten wzorzec pozwala na rozdzielenie podmiotu (np. 藕r贸d艂a danych) od obserwator贸w (np. komponent贸w UI), co u艂atwia dodawanie lub usuwanie obserwator贸w bez modyfikowania podmiotu. W globalnie rozproszonej aplikacji wzorzec Obserwator mo偶e by膰 u偶yty do efektywnego propagowania aktualizacji do klient贸w w r贸偶nych regionach.
Przypadek u偶ycia: Budowanie du偶ych, z艂o偶onych aplikacji, kt贸re musz膮 by膰 skalowalne i 艂atwe w utrzymaniu w d艂u偶szej perspektywie. Wzorce projektowe i zasady architektoniczne zapewniaj膮 ramy do organizowania kodu i zapewniaj膮, 偶e mo偶e on ewoluowa膰 wraz ze wzrostem aplikacji. Na przyk艂ad, globalna platforma medi贸w spo艂eczno艣ciowych mo偶e skorzysta膰 z architektury mikroserwis贸w, umo偶liwiaj膮c niezale偶ny rozw贸j i wdra偶anie r贸偶nych funkcji (np. profili u偶ytkownik贸w, kana艂u wiadomo艣ci, wiadomo艣ci). Poprawia to skalowalno艣膰 i odporno艣膰 platformy oraz u艂atwia dodawanie nowych funkcji i aktualizacji.
Internacjonalizacja (i18n) i lokalizacja (l10n) z TypeScriptem
Podczas tworzenia aplikacji dla globalnej publiczno艣ci, kluczowe jest uwzgl臋dnienie internacjonalizacji (i18n) i lokalizacji (l10n). TypeScript mo偶e odegra膰 kluczow膮 rol臋 w zapewnieniu, 偶e aplikacja b臋dzie 艂atwo dostosowywalna do r贸偶nych j臋zyk贸w i kultur.
- U偶yj biblioteki lokalizacyjnej: Biblioteki takie jak
i18nextireact-intldostarczaj膮 narz臋dzi do zarz膮dzania t艂umaczeniami i formatowania danych zgodnie z konwencjami specyficznymi dla danej lokalizacji. - Zewn臋trz 艂a艅cuchy znak贸w: Przechowuj wszystkie 艂a艅cuchy znak贸w widoczne dla u偶ytkownika w zewn臋trznych plikach i 艂aduj je dynamicznie w oparciu o ustawienia regionalne u偶ytkownika.
- Poprawnie formatuj daty, liczby i waluty: U偶yj funkcji formatuj膮cych specyficznych dla danej lokalizacji, aby upewni膰 si臋, 偶e daty, liczby i waluty s膮 wy艣wietlane poprawnie dla ka偶dego regionu.
- Obs艂uga liczby mnogiej: R贸偶ne j臋zyki maj膮 r贸偶ne zasady dotycz膮ce liczby mnogiej. U偶yj biblioteki lokalizacyjnej, aby poprawnie obs艂ugiwa膰 liczb臋 mnog膮.
- Wsparcie dla j臋zyk贸w pisanych od prawej do lewej (RTL): Upewnij si臋, 偶e uk艂ad aplikacji poprawnie dostosowuje si臋 do j臋zyk贸w RTL, takich jak arabski i hebrajski.
Przyk艂ad: U偶ycie i18next do zarz膮dzania t艂umaczeniami w aplikacji React. Mo偶esz zdefiniowa膰 pliki t艂umacze艅 dla ka偶dego j臋zyka i 艂adowa膰 je dynamicznie w oparciu o ustawienia regionalne u偶ytkownika. TypeScript mo偶e by膰 u偶yty do zapewnienia, 偶e klucze t艂umacze艅 s膮 u偶ywane poprawnie i 偶e przet艂umaczone ci膮gi znak贸w s膮 bezpieczne typowo.
// en.json
{
"greeting": "Hello, {{name}}!"
}
// fr.json
{
"greeting": "Bonjour, {{name}}!"
}
// Component.tsx
import i18next from 'i18next';
function MyComponent() {
const name = "World";
const greeting = i18next.t('greeting', { name });
return <div>{greeting}</div>;
}
Przypadek u偶ycia: Platformy e-commerce, aplikacje medi贸w spo艂eczno艣ciowych i inne aplikacje skierowane do globalnej publiczno艣ci. Internacjonalizacja i lokalizacja s膮 kluczowe dla zapewnienia p艂ynnego do艣wiadczenia u偶ytkownika dla u偶ytkownik贸w w r贸偶nych regionach. Na przyk艂ad, globalna platforma e-commerce musi wy艣wietla膰 opisy produkt贸w, ceny i daty w preferowanym j臋zyku i formacie u偶ytkownika. TypeScript mo偶e by膰 u偶yty do zapewnienia, 偶e proces lokalizacji jest bezpieczny typowo i 偶e przet艂umaczone ci膮gi znak贸w s膮 u偶ywane poprawnie.
Dost臋pno艣膰 (a11y) z TypeScriptem
Dost臋pno艣膰 jest krytycznym aspektem rozwoju stron internetowych, zapewniaj膮cym, 偶e aplikacja jest u偶yteczna dla os贸b z niepe艂nosprawno艣ciami. TypeScript mo偶e pom贸c w budowaniu bardziej dost臋pnych aplikacji poprzez zapewnienie bezpiecze艅stwa typ贸w i analizy statycznej.
- U偶ywaj semantycznego HTML: U偶ywaj semantycznych element贸w HTML, takich jak
<article>,<nav>i<aside>, aby logicznie strukturyzowa膰 swoj膮 tre艣膰. - Zapewnij tekst alternatywny dla obraz贸w: U偶yj atrybutu
alt, aby dostarczy膰 opisowy tekst dla obraz贸w. - U偶yj atrybut贸w ARIA: U偶yj atrybut贸w ARIA, aby dostarczy膰 dodatkowych informacji o roli, stanie i w艂a艣ciwo艣ciach element贸w.
- Zapewnij wystarczaj膮cy kontrast kolor贸w: U偶yj narz臋dzia do sprawdzania kontrastu kolor贸w, aby upewni膰 si臋, 偶e tekst ma wystarczaj膮cy kontrast z t艂em.
- Zapewnij nawigacj臋 klawiatur膮: Upewnij si臋, 偶e wszystkie interaktywne elementy mog膮 by膰 dost臋pne i obs艂ugiwane za pomoc膮 klawiatury.
Przyk艂ad: U偶ycie TypeScriptu do wymuszenia u偶ycia atrybutu alt dla obraz贸w. Mo偶esz zdefiniowa膰 typ, kt贸ry wymaga obecno艣ci atrybutu alt we wszystkich elementach <img>.
interface ImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {
alt: string;
}
function MyImage(props: ImageProps) {
return <img {...props} />;
}
// Usage
<MyImage src="image.jpg" alt="Description of the image" /> // Correct
// <MyImage src="image.jpg" /> // Error: alt is required
Przypadek u偶ycia: Wszystkie aplikacje internetowe, zw艂aszcza te u偶ywane przez zr贸偶nicowan膮 publiczno艣膰. Dost臋pno艣膰 jest kluczowa dla zapewnienia, 偶e aplikacja jest u偶yteczna dla ka偶dego, niezale偶nie od jego zdolno艣ci. Na przyk艂ad, strona internetowa rz膮du musi by膰 dost臋pna dla os贸b z niepe艂nosprawno艣ciami. TypeScript mo偶e by膰 u偶yty do egzekwowania najlepszych praktyk dost臋pno艣ci i zapewnienia, 偶e strona internetowa jest u偶yteczna dla wszystkich.
Mapa drogowa TypeScriptu: Patrz膮c w przysz艂o艣膰
TypeScript stale ewoluuje, regularnie dodawane s膮 nowe funkcje i ulepszenia. Bycie na bie偶膮co z map膮 drogow膮 TypeScriptu jest kluczowe dla wykorzystywania najnowszych osi膮gni臋膰 i budowania najnowocze艣niejszych aplikacji.
Kluczowe obszary zainteresowania:
- Ulepszona inferencja typ贸w: TypeScript stale ulepsza sw贸j system inferencji typ贸w, aby zmniejszy膰 potrzeb臋 jawnych adnotacji typ贸w.
- Lepsze wsparcie dla programowania funkcyjnego: TypeScript dodaje nowe funkcje wspieraj膮ce paradygmaty programowania funkcyjnego, takie jak currying i niezmienno艣膰.
- Udoskonalone narz臋dzia: TypeScript poprawia wsparcie dla narz臋dzi, w tym lepsz膮 integracj臋 z IDE i mo偶liwo艣ci debugowania.
- Optymalizacje wydajno艣ci: TypeScript pracuje nad optymalizacj膮 wydajno艣ci swojego kompilatora i 艣rodowiska wykonawczego.
Podsumowanie: Przyj臋cie TypeScriptu dla niezawodnego bezpiecze艅stwa typ贸w
TypeScript sta艂 si臋 pot臋偶nym narz臋dziem do tworzenia solidnych, skalowalnych i 艂atwych w utrzymaniu aplikacji. Opanowuj膮c jego zaawansowane funkcje, przyjmuj膮c najlepsze praktyki i b臋d膮c na bie偶膮co z jego map膮 drogow膮, mo偶esz odblokowa膰 pe艂ny potencja艂 TypeScriptu i osi膮gn膮膰 niezawodne bezpiecze艅stwo typ贸w. Od tworzenia z艂o偶onej logiki na poziomie typ贸w za pomoc膮 typ贸w warunkowych i mapowanych, po optymalizacj臋 wydajno艣ci i zapewnienie globalnej dost臋pno艣ci, TypeScript umo偶liwia deweloperom tworzenie wysokiej jako艣ci oprogramowania, kt贸re spe艂nia wymagania zr贸偶nicowanej, mi臋dzynarodowej publiczno艣ci. Przyjmij TypeScript, aby budowa膰 przysz艂o艣膰 aplikacji bezpiecznych typowo i niezawodnych.