TypeScript Samouczek: Co to jest, interfejs, wyliczenie, tablica

โšก Inteligentne podsumowanie

TypeScript jest silnie typizowanym nadzbiorem JavaSkrypt, ktรณry kompiluje siฤ™ do zwykล‚ego kodu JavaSkrypt dodaje klasy, interfejsy, typy wyliczeniowe, moduล‚y i przestrzenie nazw. Ten artykuล‚ obejmuje instalacjฤ™, zmienne, typy, tablice, klasy, modyfikatory dostฤ™pu, interfejsy, funkcje, typy wyliczeniowe, moduล‚y i deklaracje otoczenia.

  • ๐Ÿงฌ Relacja jฤ™zykowa: Kaลผdy waลผny JavaProgram skryptowy jest prawidล‚owy TypeScript, a kompilator emituje zwykล‚y JavaSkrypt dla dowolnej wersji docelowej.
  • ๐Ÿ”’ Statyczny Typing: Zmienna zachowuje typ podany podczas deklaracji, wiฤ™c niezgodnoล›ฤ‡ jest zgล‚aszana w czasie kompilacji, a nie w czasie wykonywania.
  • ๐Ÿงฑ Orientacja obiektowa: Klasy, dziedziczenie oraz modyfikatory public, private i protected wprowadzajฤ… znajomฤ… strukturฤ™ do kodu przeglฤ…darki.
  • ๐Ÿ“ Interfejsy: Interfejs definiuje interfejstracLiczba wล‚aล›ciwoล›ci i metod, ktรณre musi speล‚niaฤ‡ zmienna, funkcja lub klasa.
  • ๐Ÿ”ข Wyliczenia: Nazwane zestawy staล‚ych kompilujฤ… siฤ™ do funkcji wywoล‚ywanych przez siebie, poniewaลผ JavaSkrypt nie ma natywnego typu wyliczeniowego.
  • ๐Ÿ“ฆ Moduล‚y: Eksport i import zachowujฤ… deklaracje lokalne dla pliku i zapobiegajฤ… globalnym kolizjom nazw.
  • ๐Ÿ”Œ Deklaracje ล›rodowiskowe: Plik .d.ts opisuje stronฤ™ trzeciฤ… JavaBiblioteka skryptรณw umoลผliwiajฤ…ca sprawdzanie typรณw bez koniecznoล›ci ponownego pisania.

TypeScript Poradnik

Czym jest TypeScript?

TypeScript jest nadzbiorem JavaScenariusz. TypeScript to obiektowy jฤ™zyk programowania, ktรณry obsล‚uguje klasy, interfejsy i wiele wiฤ™cej. Jest to jฤ™zyk open-source opracowany przez Microsoft ktรณry statycznie kompiluje kod do JavaSkrypt. Moลผna go ล‚atwo uruchomiฤ‡ w przeglฤ…darce lub w Nodejs.

Wszystkie najnowsze funkcje wydane dla ECMAScript sฤ… obsล‚ugiwane w TypeScripti dodatkowo TypeScript ma wล‚asne funkcje obiektowe, takie jak interfejsy, deklaracje otoczenia i dziedziczenie klas, ktรณre pomagajฤ… w rozwojuping duลผa aplikacja, ktรณrej zbudowanie w inny sposรณb byล‚oby trudne JAVASCRIPT.

Zwiฤ…zek jest jednokierunkowy. Kaลผdy waลผny JavaPlik skryptu jest juลผ prawidล‚owy TypeScript, ale odwrotna sytuacja nie jest prawdziwa, poniewaลผ adnotacje typu istniejฤ… tylko w TypeScript i sฤ… usuwane podczas kompilacji.

Dlaczego warto korzystaฤ‡ TypeScript?

Oto najwaลผniejsze korzyล›ci pล‚ynฤ…ce z korzystania z TypeScript:

  • Duลผe i zล‚oลผone projekty w JavaSkrypty sฤ… trudne do kodowania i utrzymania.
  • TypeScript pomaga w duลผej mierze w organizacji kodu i usuwa wiฤ™kszoล›ฤ‡ bล‚ฤ™dรณw podczas kompilacji, a nie w czasie wykonywania.
  • TypeScript obsล‚uguje biblioteki JS i dokumentacjฤ™ API.
  • Jest to jฤ™zyk skryptowy z opcjonalnym typowaniem, co oznacza, ลผe โ€‹โ€‹typy moลผna przyjmowaฤ‡ stopniowo.
  • TypeScript kod moลผna przekonwertowaฤ‡ na zwykล‚y JavaKod skryptu dla dowolnej przeglฤ…darki docelowej.
  • Zapewnia lepszฤ… strukturalizacjฤ™ kodu i techniki programowania obiektowego.
  • Umoลผliwia lepsze wsparcie narzฤ™dzi czasu tworzenia, w tym automatyczne uzupeล‚nianie i bezpieczne refaktoryzowanie.
  • Moลผe rozszerzyฤ‡ moลผliwoล›ci jฤ™zyka poza standard, dodajฤ…c takie funkcje jak dekoratory.

Najwiฤ™kszฤ… praktycznฤ… korzyล›ciฤ… jest wsparcie edytora. Poniewaลผ kompilator zna ksztaล‚t kaลผdej wartoล›ci, edytor moลผe zmieniฤ‡ nazwฤ™ wล‚aล›ciwoล›ci w caล‚ym projekcie i zgล‚osiฤ‡ kaลผde miejsce, ktรณre juลผ nie pasuje.

TypeScript History

Przyjrzyjmy siฤ™ waลผnym punktom orientacyjnym z historii TypeScript:

  • Po dwรณch latach wewnฤ™trznego rozwoju w Microsoft, TypeScript Wersja 0.9 zostaล‚a wydana w 2013 roku.
  • TypeScript Wersja 1.0 z dodatkowฤ… obsล‚ugฤ… typรณw generycznych zostaล‚a wydana na konferencji Build 2014.
  • W lipcu 2014 nowy TypeScript pojawiล‚ siฤ™ kompilator, ktรณry byล‚ piฤ™ฤ‡ razy szybszy od poprzedniej wersji.
  • W lipcu 2015 r. dodano obsล‚ugฤ™ moduล‚รณw ES6, sล‚owa kluczowego przestrzeni nazw, forโ€ฆof i dekoratorรณw.
  • W listopadzie 2016 r. dodano typy mapowane, typy kluczy i wyszukiwania oraz obiekty rest i spread.
  • 27 marca 2018 r. dodano typy warunkowe i ulepszono instrukcjฤ™ keyof z typami przeciฤ™cia.
  • TypeScript Wersja 5.0, wydana w marcu 2023 r., unowoczeล›niล‚a dekoratory i zmniejszyล‚a rozmiar pakietu.
  • TypeScript Wersja 6.0 ukazaล‚a siฤ™ w marcu 2026 r. jako ostateczna wersja oparta na JavaBaza kodu skryptu.
  • TypeScript Wersja 7.0 przenosi kompilator do natywnej implementacji jฤ™zyka Go, ktรณra Microsoft raportuje, ลผe jest okoล‚o dziesiฤ™ฤ‡ razy szybszy niลผ wersja 6.0.

Kto uลผywa TypeScript?

TypeScript Nie jest juลผ wyborem niszowym. Stanowi podstawฤ™ kilku najpopularniejszych narzฤ™dzi front-end i back-end, a poniลผsza lista pokazuje, gdzie poczฤ…tkujฤ…cy najprawdopodobniej siฤ™ z nim zetknฤ….

  • Kฤ…towy: Framework Angular jest napisany w TypeScripti oczekuje siฤ™, ลผe bฤ™dzie w nim rรณwnieลผ pisany kod aplikacji.
  • Projekty React i Vue: Oba ekosystemy sฤ… oficjalnie przewoลผone TypeScript szablony, a wiฤ™kszoล›ฤ‡ nowoczesnych programรณw startowych domyล›lnie je wล‚ฤ…cza.
  • Tylne zakoล„czenia Node.js: Frameworki serwerowe, takie jak NestJS, sฤ… zbudowane wokรณล‚ TypeScript klasy i dekoratory.
  • Narzฤ™dzia edytora: Visual Studio Code jest samo w sobie duลผe TypeScript baza kodu, dlatego obsล‚uga tego jฤ™zyka jest tak kompletna.
  • Duลผe interfejsy korporacyjne: Zespoล‚y pracujฤ…ce z wieloma wspรณล‚pracownikami stosujฤ… tฤ™ metodฤ™ w celu wychwytywania bล‚ฤ™dรณw integracji przed wdroลผeniem.

Jak pobraฤ‡ i zainstalowaฤ‡ TypeScript

Oto krok po kroku proces pobierania i instalacji TypeScript:

Krok 1) Pobierz i zainstaluj Nodejs

Przejdลบ do oficjalnej strony Nodejs, https://nodejs.org/en/download/, a nastฤ™pnie pobierz i zainstaluj Nodejs dla swojego systemu operacyjnego. Szczegรณล‚owe instrukcje znajdziesz w przewodniku na stronie jak pobraฤ‡ i zainstalowaฤ‡ Node.js.

Krok 2) Sprawdลบ wersjฤ™ Nodejs i npm

Aby sprawdziฤ‡, czy Nodejs i npm sฤ… zainstalowane, sprawdลบ wersjฤ™ w wierszu poleceล„.

D:\typeproject>node --version
v22.14.0

D:\typeproject>npm --version
10.9.2

Dziaล‚a kaลผda aktualna wersja Node LTS. TypeScript Do uruchomienia kompilatora wymagana jest jedynie obsล‚ugiwana wersja Node.

Krok 3) TypeScript instalacja sprzฤ™tu

Utwรณrz katalog projektu typeproject\ i uruchom polecenie npm init, jak pokazano w poniลผszym poleceniu:

npm init

Krok 4) Rozpocznij instalacjฤ™

Tworzy to plik package.json, w ktรณrym bฤ™dฤ… przechowywane zaleลผnoล›ci naszego projektu.

Po zakoล„czeniu zainstaluj TypeScript w sposรณb nastฤ™pujฤ…cy:

npm -g install typescript

Powyลผsze polecenie zajmie siฤ™ instalacjฤ… TypeScriptDodanie โ€ž-gโ€ do npm install spowoduje instalacjฤ™ TypeScript globalnie. Zaletฤ… uลผywania -g jest to, ลผe bฤ™dziesz mรณgล‚ uลผywaฤ‡ TypeScript tsc polecenie z dowolnego katalogu, poniewaลผ jest ono instalowane globalnie. Jeล›li nie chcesz instalowaฤ‡ TypeScript globalnie uลผyj poniลผszego polecenia:

npm install --save-dev typescript

Utwรณrz folder src\ w katalogu swojego projektu i w nim utwรณrz TypeScript plik test.ts i napisz swรณj kod.

Przykล‚ad: test.ts

function add(x:number, y:number) {
	return x+y;
}

let sum = add(5,10);
console.log(sum);

skompilowaฤ‡ TypeScript kod do Javascript

Aby skompilowaฤ‡ powyลผszy kod uลผyj nastฤ™pujฤ…cego polecenia.

If TypeScript jest zainstalowany globalnie, uลผyj poniลผszego polecenia:

tsc test.ts

If TypeScript jest zainstalowany lokalnie w Twoim projekcie, musisz uลผyฤ‡ ล›cieลผki TypeScript z node_modules, jak pokazano, lub uruchom go przez npx:

node_modules\typescript\bin\tsc test.ts

OR

npx tsc test.ts

Powyลผsze polecenie utworzy plik test.js, w ktรณrym zostanie skompilowany kod JavaScenariusz.

Przykล‚ad: test.js

function add(x, y) {
    return x + y;
}
var sum = add(5, 10);
console.log(sum);

Wykonaฤ‡ Javascript za pomocฤ… Nodejsa

Teraz wykonamy test.js w Nodejs w nastฤ™pujฤ…cy sposรณb:

D:\typeproject\src>node test.js
15

Wartoล›ฤ‡ przekazana do console.log jest wyล›wietlana po uruchomieniu test.js.

Wykonaฤ‡ JavaSkrypt w przeglฤ…darce

Przykล‚ad:

<html>
<head></head>
<body>
<script type="text/javascript" src="test.js"></script>
</body>
</html>

Wykonaฤ‡ Javascript za pomocฤ… Nodejsa

skompilowaฤ‡ TypeScript kod do Javascript przy uลผyciu wersji EcmaScript

TypeScript Obsล‚uguje wszystkie wydane funkcje ECMAScript, z ktรณrych programiล›ci mogฤ… korzystaฤ‡ podczas kodowania. Jednak nie wszystkie nowe funkcje sฤ… obsล‚ugiwane w starszych przeglฤ…darkach, dlatego moลผe byฤ‡ konieczna kompilacja do starszej wersji ECMAScript. TypeScript udostฤ™pnia opcje kompilatora, ktรณre robiฤ… dokล‚adnie to.

Przykล‚ad: test.ts

var addnumbers = (a, b) => {
    return a+b;
}

addnumbers(10, 20);

Aby skompilowaฤ‡ do wybranej wersji ES, moลผesz uลผyฤ‡ opcji target lub t w swoim poleceniu w nastฤ™pujฤ…cy sposรณb:

tsc --target ES6  test.ts

OR

tsc -t ES6 test.ts

Domyล›lnie, celem dla klasycznego kompilatora jest ES3. Jeล›li chcesz to zmieniฤ‡, moลผesz uลผyฤ‡ powyลผszego polecenia.

Obecnie bฤ™dziemy uลผywaฤ‡ ES6 jako celu:

tsc --target ES6  test.ts

test.ts do test.js

var addnumbers = (a, b) => {
    return a+b;
}

addnumbers(10, 20);

Kod pozostaje taki sam, poniewaลผ uลผyta funkcja strzaล‚kowa jest funkcjฤ… ES6 i nie ulega zmianie po kompilacji do ES6.

Domyล›lnie celem jest ES3, wiฤ™c bez celu plik test.js bฤ™dzie wyglฤ…daล‚ nastฤ™pujฤ…co:

var addnumbers = function (a, b) {
    return a + b;
};
addnumbers(10, 20);

Tutaj gruba strzaล‚ka zostaล‚a zamieniona na zwykล‚ฤ… anonimowฤ… funkcjฤ™.

๐Ÿ’ก Wskazรณwka: Zamiast za kaลผdym razem przekazywaฤ‡ opcje w wierszu poleceล„, uruchom tsc --init aby wygenerowaฤ‡ plik tsconfig.json. Kompilator odczytuje nastฤ™pnie ustawienia target, outDir i strict z tego pliku dla caล‚ego projektu.

Zmienne w TypeScript

Zmienne sล‚uลผฤ… do przechowywania wartoล›ci, a wartoล›ฤ‡ moลผe byฤ‡ ciฤ…giem znakรณw, liczbฤ…, wartoล›ciฤ… logicznฤ… lub wyraลผeniem. Jeล›li chodzi o zmienne w TypeScript, sฤ… podobne do JAVASCRIPT. Nauczmy siฤ™ wiฤ™c deklarowaฤ‡ i przypisywaฤ‡ wartoล›ฤ‡ zmiennym w TypeScript.

Zmiennych nie moลผna uลผywaฤ‡ w kodzie bez ich zdefiniowania. Aby zadeklarowaฤ‡ zmiennฤ…, moลผna uลผyฤ‡

byล‚o sล‚owo kluczowe,

niech keyword

const keyword

Praca ze zmiennymi w TypeScript jest podobne do JavaSkrypt i uลผytkownicy zaznajomieni z JavaSkrypt z ล‚atwoล›ciฤ… sobie z tym poradzi. W nowoczesnym kodzie, niech oraz const sฤ… preferowane w stosunku do byล‚o, poniewaลผ ich zakres bloku zapobiega caล‚ej klasie bล‚ฤ™dรณw.

Deklarowanie zmiennych za pomocฤ… var

Skล‚adnia:

var firstname = "Roy";

Przyjrzyjmy siฤ™ kilku TypeScript przykล‚ady pozwalajฤ…ce zrozumieฤ‡ dziaล‚anie sล‚owa kluczowego var, a takลผe zakres zmiennych zadeklarowanych za pomocฤ… byล‚o sล‚owo kluczowe.

1 przykล‚ad:

var k = 1; // variable k will have a global scope

function test() {
    var c = 1; // variable c is local and accessible only inside function test
    return k++;
}

test(); // output as 1
test(); // output as 2
alert(c); // will throw error, Uncaught ReferenceError: c is not defined

2 przykล‚ad:

var t = 0; // variable t is declared in global scope
function test() {
    var t = 10; // t is redeclared inside the function, so changes stay local
    return t;
}
test(); // will return 10
console.log(t); // will console 0

3 przykล‚ad:

var i = 0;
function test() {
    if (i > 0) {
      var t = 1;
    }
    return t;
}

test(); // returns undefined. The if block did not run, yet t is still declared
        // because var declarations are hoisted to the whole function.
i++;    // value of i is incremented
test(); // since i > 0 the if block runs and the value returned is 1

Deklarowanie zmiennych za pomocฤ… let

TypeScript skล‚adnia let jest podana poniลผej:

Skล‚adnia:

let name = "Roy";

Dziaล‚anie niech zmienna jest prawie taka sama jak byล‚o, ale z jednฤ… waลผnฤ… rรณลผnicฤ…, ktรณrฤ… pokazuje poniลผszy przykล‚ad.

Przykล‚ad:

let i = 1;
function test() {
    if (i > 0) {
	  let t = 1;
    }
    return t;
}

test(); // throws an error: Cannot find name 't'

Powyลผej TypeScript przykล‚ad wyrzuca bล‚ฤ…d, ale ten sam kod zadziaล‚aล‚by w przypadku byล‚o sล‚owo kluczowe. Zmienne zadeklarowane za pomocฤ… niech sฤ… dostฤ™pne tylko w bloku, w ktรณrym zostaล‚y zadeklarowane. W tym przykล‚adzie t istnieje tylko w bloku if, a nie w caล‚ej funkcji.

To samo dotyczy dowolnej funkcji, pฤ™tli for, pฤ™tli while czy bloku switch. Zmienna let jest dostฤ™pna tylko wewnฤ…trz tego bloku, a odwoล‚anie siฤ™ do niej poza nim powoduje bล‚ฤ…d. To jest gล‚รณwna rรณลผnica miฤ™dzy var a let.

Deklarowanie zmiennych za pomocฤ… const

Const oznacza zmienne staล‚e. Sฤ… one podobne do zmiennych let, z tฤ… rรณลผnicฤ…, ลผe raz przypisanej wartoล›ci nie moลผna zmieniฤ‡. Deklaracja const musi zatem zostaฤ‡ zainicjowana w tym samym wierszu.

Skล‚adnia:

const name = "Roy";

Przykล‚ad:

const age = "25";
age = "30"; // error: Cannot assign to 'age' because it is a constant

const total; // error: 'const' declarations must be initialized

Uลผywaj const zawsze, gdy wiesz, ลผe przypisana wartoล›ฤ‡ nie zostanie ponownie przypisana. Pamiฤ™taj, ลผe const zapobiega ponownemu przypisaniu powiฤ…zania, a nie modyfikacji obiektu, na ktรณry ono wskazuje.

Wpisuje TypeScript

TypeScript jest jฤ™zykiem silnie typowanym, podczas gdy JavaSkrypt nie jest. Zmiennฤ…, ktรณrej wartoล›ฤ‡ jest zdefiniowana jako ciฤ…g znakรณw, moลผna bez problemu zmieniฤ‡ na liczbฤ™. JavaScenariusz. Tego samego nie toleruje siฤ™ w TypeScript, w TypeScriptTyp zmiennej jest definiowany na poczฤ…tku i musi byฤ‡ zachowany przez caล‚y czas wykonywania. Kaลผda zmiana prowadzi do bล‚ฤ™du kompilacji. JavaScenariusz.

Oto podstawowe typy:

Typ Akceptuje Przykล‚adowa deklaracja
numer Liczby caล‚kowite, zmiennoprzecinkowe i uล‚amki niech a: liczba = 10;
ciฤ…g Tylko wartoล›ci tekstowe niech s: string = โ€œczeล›ฤ‡โ€;
boolean tylko prawda lub faล‚sz niech b: wartoล›ฤ‡ logiczna = prawda;
kaลผdy Dowolna wartoล›ฤ‡, bez sprawdzania niech x: dowolny = 123;
uniewaลผniฤ‡ Brak wartoล›ci zwracanej funkcja f(): void {}

Numer

Przyjmuje tylko liczby caล‚kowite, zmiennoprzecinkowe, uล‚amki i podobne wartoล›ci liczbowe.

Skล‚adnia:

let a :number = 10;
let marks :number = 150;
let price :number = 10.2;

Oto kilka waลผnych metod, ktรณre moลผna stosowaฤ‡ w przypadku typรณw liczbowych:

do naprawionego() โ€“ zamieni liczbฤ™ na ciฤ…g znakรณw, zachowujฤ…c podane w metodzie miejsca dziesiฤ™tne.

toString () โ€“ ta metoda zamieni liczbฤ™ na ciฤ…g znakรณw.

wartoล›ฤ‡() โ€“ ta metoda zwrรณci pierwotnฤ… wartoล›ฤ‡ liczby.

doPrecyzji() โ€“ ta metoda sformatuje liczbฤ™ do okreล›lonej dล‚ugoล›ci.

Przykล‚ad: ze wszystkimi metodami liczbowymi

let _num :number = 10.345;
_num.toFixed(2);      // "10.35"
_num.valueOf();      // 10.345
_num.toString();     // "10.345"
_num.toPrecision(2); // "10"

sznur

String: tylko wartoล›ci typu string.

Skล‚adnia:

let str :string = "hello world";

Oto kilka waลผnych metod, ktรณre moลผna stosowaฤ‡ w przypadku typรณw ciฤ…gรณw:

  • dzieliฤ‡() โ€“ ta metoda podzieli ciฤ…g na tablicฤ™.
  • charAt() โ€“ ta metoda zwrรณci znak o podanym indeksie.
  • indeks() โ€“ metoda ta zwraca pozycjฤ™ pierwszego wystฤ…pienia podanej wartoล›ci.
  • obsล‚ugi produkcji rolnej, ktรณra zastฤ…piล‚a() โ€“ ta metoda przyjmuje 2 ciฤ…gi znakรณw. Szuka pierwszej wartoล›ci w ciฤ…gu i, jeล›li jest obecna, zastฤ™puje jฤ… drugฤ…, zwracajฤ…c nowy ciฤ…g znakรณw.
  • trym() โ€“ ta metoda usunie spacje po obu stronach ciฤ…gu znakรณw.
  • podstr() โ€“ ta metoda zwrรณci czฤ™ล›ฤ‡ ciฤ…gu znakรณw, w zaleลผnoล›ci od podanej pozycji poczฤ…tkowej i dล‚ugoล›ci.
  • podciฤ…g() โ€“ ta metoda zwraca czฤ™ล›ฤ‡ ciฤ…gu znakรณw, w zaleลผnoล›ci od pozycji poczฤ…tkowej i koล„cowej. Znak na pozycji koล„cowej jest pomijany.
  • do wielkich liter() โ€“ zamienia ciฤ…g na wielkie litery.
  • do maล‚ych liter() โ€“ konwertuje ciฤ…g znakรณw na maล‚e litery.

Przykล‚ad:

let _str:string = "Typescript";

_str.charAt(1);                // y
_str.split("");                // ["T","y","p","e","s","c","r","i","p","t"]
_str.indexOf("s");             // 4, gives -1 if the value does not exist
_str.replace("Type", "Coffee"); // "Coffeescript"
_str.trim();                    // "Typescript"
_str.substr(4, _str.length);   // "script"
_str.substring(4, 10);         // "script"
_str.toUpperCase();             // "TYPESCRIPT"
_str.toLowerCase();             // "typescript"

Boolean

Wartoล›ฤ‡ logiczna akceptuje tylko wartoล›ci logiczne prawda i faล‚sz. W przeciwieล„stwie do zwykล‚ych JavaSkrypt, liczby 0 i 1 nie sฤ… akceptowane, poniewaลผ sฤ… typu liczbowego.

Skล‚adnia:

let status :boolean = true;
let isDone :boolean = false;

let bflag :boolean = 1;
// error: Type 'number' is not assignable to type 'boolean'

Kaลผdy

Skล‚adnia:

let a :any = 123
a = "hello world"; // changing type will not give any error.

Zmienne zadeklarowane za pomocฤ… kaลผdy type moลผe zawieraฤ‡ ciฤ…g znakรณw, liczbฤ™, tablicฤ™, wartoล›ฤ‡ logicznฤ… lub pustkฤ™. TypeScript nie spowoduje ลผadnego bล‚ฤ™du kompilacji, co jest podobne do bล‚ฤ™dรณw zmiennych w JavaSkrypt. Uลผywaj typu โ€žanyโ€ tylko wtedy, gdy nie masz pewnoล›ci co do typu wartoล›ci, ktรณra bฤ™dzie powiฤ…zana z danฤ… zmiennฤ…, poniewaลผ wyล‚ฤ…cza on wszelkie sprawdzanie tej wartoล›ci.

Uniewaลผniฤ‡

Typ void jest najczฤ™ล›ciej uลผywany jako typ zwracany przez funkcjฤ™, ktรณra niczego nie zwraca.

Skล‚adnia:

function testfunc():void{
 //code here
}

TypeScript Szyk

An Szyk in TypeScript to typ danych, w ktรณrym moลผna przechowywaฤ‡ wiele wartoล›ci. Nauczmy siฤ™, jak deklarowaฤ‡ i przypisywaฤ‡ wartoล›ci do operacji tablicowych wโ€ฆ TypeScript.

Poniewaลผ TypeScript To jฤ™zyk silnie typizowany, dlatego naleลผy okreล›liฤ‡ typ danych wartoล›ci w tablicy. W przeciwnym razie zostanie ona potraktowana jako typ dowolny.

Zadeklaruj i zainicjuj tablicฤ™

Skล‚adnia:

let nameofthearray : Array<typehere>

Przykล‚ad

let months: Array<string> = ["Jan", "Feb", "March", "April", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"]; // array with all string values

let years: Array<number> = [2015, 2016, 2017, 2018, 2019]; // array with all numbers

let month_year: Array<string | number> = ["Jan", 2015, "Feb", 2016]; // mixed

let alltypes: Array<any> = [true, false, "Harry", 2000, { "a": "50", "b": "20" }]; // any type

Rรณลผne sposoby uzyskiwania dostฤ™pu do elementรณw z tablicy

Aby pobraฤ‡ elementy z tablicy, wartoล›ci zaczynajฤ… siฤ™ od indeksu 0 i koล„czฤ… na dล‚ugoล›ci tablicy pomniejszonej o jeden.

let years: Array<number> = [2016, 2017, 2018, 2019];
years[0]; // output will be 2016
years[1]; // output will be 2017
years[2]; // output will be 2018
years[3]; // output will be 2019

Elementy tablicy moลผna rรณwnieลผ pobraฤ‡ za pomocฤ… TypeScript dla pฤ™tla, jak pokazano niลผej.

Korzystanie z TypeScript dla pฤ™tli

let years: Array<number> = [2016, 2017, 2018, 2019];
for (let i = 0; i < years.length; i++) {
     console.log(years[i]);
}

Wyjล›cie:

2016
2017
2018
2019

โš ๏ธ Ostrzeลผenie: Warunek pฤ™tli musi byฤ‡ i < years.length. Pismo i <= years.length uruchamia jednฤ… dodatkowฤ… iteracjฤ™ i drukuje undefined, poniewaลผ ostatni prawidล‚owy indeks to zawsze dล‚ugoล›ฤ‡ pomniejszona o jeden.

Korzystanie z pฤ™tli for-in

let years: Array<number> = [2016, 2017, 2018, 2019];
for (let i in years) {
     console.log(years[i]);
}

Wyjล›cie:

2016
2017
2018
2019

Korzystanie z pฤ™tli for-of

let years: Array<number> = [2016, 2017, 2018, 2019];
for (let i of years) {
     console.log(i);
}

Wyjล›cie:

2016
2017
2018
2019

Korzystanie z pฤ™tli forEach

let years: Array<number> = [2016, 2017, 2018, 2019];
years.forEach(function(yrs, i) {
  console.log(yrs);
});

Wyjล›cie:

2016
2017
2018
2019

TypeScript Metody tablicowe

TypeScript Obiekt Array ma wiele wล‚aล›ciwoล›ci i metod, ktรณre uล‚atwiajฤ… programistom ล‚atwฤ… i efektywnฤ… obsล‚ugฤ™ tablic. Wartoล›ฤ‡ wล‚aล›ciwoล›ci moลผna uzyskaฤ‡, okreล›lajฤ…c arrayname.property, a wynik metody, okreล›lajฤ…c arrayname.method().

Czล‚onek Cel Zwroty
dล‚ugoล›ฤ‡ Liczba elementรณw w tablicy numer
odwrรณciฤ‡() Reversekolejnoล›ฤ‡ elementรณw na miejscu Ta sama tablica
sortowaฤ‡() Sortuje elementy na swoim miejscu Ta sama tablica
Muzyka pop() Usuwa ostatni element Usuniฤ™ty element
Zmiana() Usuwa pierwszy element Usuniฤ™ty element
Pchaฤ‡() Dodaje wartoล›ฤ‡ jako ostatni element Nowa dล‚ugoล›ฤ‡
konkat() ลฤ…czy dwie tablice w jednฤ… Nowa tablica

Przykล‚ad wล‚aล›ciwoล›ci dล‚ugoล›ci

let months: Array<string> = ["Jan", "Feb", "March", "April", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"];

console.log(months.length);  // 12

Przykล‚ad metody odwrotnej

console.log(months.reverse());
// ["Dec","Nov","Oct","Sept","Aug","July","June","May","April","March","Feb","Jan"]

Przykล‚ad metody sortowania

console.log(months.sort());
// ["April","Aug","Dec","Feb","Jan","July","June","March","May","Nov","Oct","Sept"]

Przykล‚ad metody pop

console.log(months.pop()); // Dec

Przykล‚ad metody przesuniฤ™cia

console.log(months.shift()); // Jan

Przykล‚ad metody push

let years: Array<number> = [2015, 2016, 2017, 2018, 2019];
console.log(years.push(2020)); // 6, the new length
years.forEach(function(yrs, i) {
  console.log(yrs); // 2015, 2016, 2017, 2018, 2019, 2020
});

Przykล‚ad metody concat

let array1: Array<number> = [10, 20, 30];
let array2: Array<number> = [100, 200, 300];
console.log(array1.concat(array2)); // [10, 20, 30, 100, 200, 300]

Klasa w TypeScript

TypeScript jest nadzbiorem JavaSkrypt, wiฤ™c wszystko co moลผliwe JavaSkrypt jest rรณwnieลผ moลผliwy w TypeScript. Klasa to funkcja dodana od wersji ES6. Wczeล›niej w JavaFunkcjonalnoล›ฤ‡ skryptu, przypominajฤ…ca klasฤ™, zostaล‚a osiฤ…gniฤ™ta dziฤ™ki funkcji z metodami prototypowymi, umoลผliwiajฤ…cymi ponowne wykorzystanie kodu. Uลผywajฤ…c klasy, kod moลผe zbliลผyฤ‡ siฤ™ do jฤ™zykรณw takich jak Java, C# i Python, gdzie kod moลผna ล‚atwo ponownie wykorzystaฤ‡.

Definiowanie klasy w TypeScript

Oto podstawowa skล‚adnia klasy w TypeScript:

class nameofclass {
     //define your properties here

    constructor() {
     // initialize your properties here
    }

   //define methods for class
}

Przykล‚ad: dziaล‚ajฤ…cy przykล‚ad w klasie

class Students {
    age : number;
    name : string;
    roll_no : number;

    constructor(age: number, name:string, roll_no: number) {
        this.age = age;
        this.name = name;
        this.roll_no = roll_no;
    }

    getRollNo(): number {
        return this.roll_no;
    }

    getName() : string {
        return this.name;
    }

    getAge() : number {
        return this.age;
    }
}

W powyลผszym przykล‚adzie mamy klasฤ™ o nazwie โ€žStudenciโ€. Ma ona wล‚aล›ciwoล›ci โ€žwiekโ€, โ€žimiฤ™โ€ i โ€žnr rolkiโ€.

Konstruktor w A TypeScript Klasa

Klasa Students zdefiniowana powyลผej ma konstruktor pokazany poniลผej:

constructor(age: number, name:string, roll_no: number) {
        this.age = age;
        this.name = name;
        this.roll_no = roll_no;
    }

Metoda konstruktora ma parametry: wiek, nazwa i numer rolki. Konstruktor inicjalizuje wล‚aล›ciwoล›ci podczas tworzenia instancji klasy. Dostฤ™p do wล‚aล›ciwoล›ci uzyskuje siฤ™ za pomocฤ… to Sล‚owo kluczowe, na przykล‚ad this.age, aby uzyskaฤ‡ dostฤ™p do age i this.roll_no, aby uzyskaฤ‡ dostฤ™p do roll_no. Moลผesz rรณwnieลผ uลผyฤ‡ konstruktora domyล›lnego, jak pokazano poniลผej:

constructor () {}

Metody wewnฤ…trz a TypeScript Klasa

W klasie Students zdefiniowane sฤ… metody, na przykล‚ad getRollNo(), getName() i getAge(), ktรณre zwracajฤ… wartoล›ci wล‚aล›ciwoล›ci roll_no, name i age.

getRollNo(): number {
        return this.roll_no;
}

getName() : string {
	return this.name;
}

getAge() : number {
	return this.age;
}

Tworzenie instancji klasy w TypeScript

In TypeScriptAby utworzyฤ‡ instancjฤ™ klasy, naleลผy uลผyฤ‡ operatora new. Tworzฤ…c instancjฤ™ za pomocฤ… operatora new, otrzymujemy obiekt, ktรณry moลผe uzyskaฤ‡ dostฤ™p do wล‚aล›ciwoล›ci i metod klasy, jak pokazano poniลผej:

let student_details = new Students(15, "Harry John", 33);
student_details.getAge();  // 15
student_details.getName(); // Harry John

Kompilacja TypeScript Klasa do JavaScenariusz

Do kompilacji moลผesz uลผyฤ‡ polecenia tsc, jak pokazano poniลผej JavaScenariusz.

Command: tsc  Students.ts

Dane wyjล›ciowe JavaKod skryptu podczas kompilacji wyglฤ…da nastฤ™pujฤ…co:

var Students = /** @class */ (function () {
    function Students(age, name, roll_no) {
        this.age = age;
        this.name = name;
        this.roll_no = roll_no;
    }
    Students.prototype.getRollNo = function () {
        return this.roll_no;
    };
    Students.prototype.getName = function () {
        return this.name;
    };
    Students.prototype.getAge = function () {
        return this.age;
    };
    return Students;
}());

In JavaSkrypt, klasa jest konwertowana na funkcjฤ™ wywoล‚ujฤ…cฤ… siฤ™ sama.

Dziedziczenie klas

Klasy mogฤ… byฤ‡ dziedziczone przy uลผyciu metody rozciฤ…ga siฤ™ sล‚owo kluczowe w TypeScript.

Skล‚adnia dziedziczenia klas:

class A {
     //define your properties here

    constructor() {
     // initialize your properties here
    }

   //define methods for class

}

class B extends A {
 //define your properties here

    constructor() {
     // initialize your properties here
    }

   //define methods for class

}

klasa B. bฤ™dzie mรณgล‚ siฤ™ podzieliฤ‡ klasa A metody i wล‚aล›ciwoล›ci.

Oto dziaล‚ajฤ…cy przykล‚ad klasy wykorzystujฤ…cej dziedziczenie:

class Person {
    name: string;
    age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    getName(): string {
        return this.name;
    }

    getAge(): number {
        return this.age;
    }
}

class Student extends Person {
    tmarks: number;
    getMarks(): number {
        return this.tmarks;
    }

    setMarks(tmarks) {
        this.tmarks = tmarks;
    }
}

let _std1 = new Student('Sheena', 24);
_std1.getAge();      // output is 24
_std1.setMarks(500);
_std1.getMarks();    // output is 500

Masz dwie klasy: Person i Student. Klasa Student rozszerza klasฤ™ Person, a obiekt utworzony na podstawie klasy Student moลผe uzyskiwaฤ‡ dostฤ™p do wล‚asnych metod i wล‚aล›ciwoล›ci, a takลผe do metod i wล‚aล›ciwoล›ci klasy, ktรณrฤ… rozszerza.

Teraz dodajmy kilka zmian do klasy powyลผej.

Przykล‚ad:

class Person {
    name: string;
    age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    getName(): string {
        return this.name;
    }

    getAge(): number {
        return this.age;
    }
}

class Student extends Person {
    tmarks: number;
    constructor(name: string, age: number, tmarks: number) {
        super(name, age);
        this.tmarks = tmarks; // the derived property must be assigned too
    }
    getMarks(): number {
        return this.tmarks;
    }

    setMarks(tmarks) {
        this.tmarks = tmarks;
    }
}

let _std1 = new Student('Sheena', 24, 500);
_std1.getAge();   // output is 24
_std1.getMarks(); // output is 500

Zmiana w porรณwnaniu z poprzednim przykล‚adem polega na zdefiniowaniu konstruktora w klasie Student. Konstruktor przyjmuje te same parametry co klasa bazowa, a takลผe wszelkie wล‚asne parametry dodatkowe.

In TypeScript Musisz wywoล‚aฤ‡ super ze wszystkimi parametrami klasy bazowej. Musi to byฤ‡ pierwsze polecenie w konstruktorze, poniewaลผ super uruchamia konstruktor klasy rozszerzonej. Kaลผda wล‚aล›ciwoล›ฤ‡ zadeklarowana przez klasฤ™ pochodnฤ…, โ€‹โ€‹taka jak tmarks, musi zostaฤ‡ nastฤ™pnie jawnie przypisana, w przeciwnym razie getMarks zwrรณci wartoล›ฤ‡ undefined.

Modyfikatory dostฤ™pu w TypeScript

TypeScript Obsล‚uguje modyfikatory dostฤ™pu: publiczny, prywatny i chroniony (protected) do metod i wล‚aล›ciwoล›ci. Domyล›lnie, jeล›li nie podano modyfikatora dostฤ™pu, metoda lub wล‚aล›ciwoล›ฤ‡ jest uznawana za publicznฤ… i jest ล‚atwo dostฤ™pna z obiektu klasy.

W przypadku modyfikatorรณw dostฤ™pu prywatnego, elementy nie sฤ… dostฤ™pne z poziomu obiektu klasy i sฤ… przeznaczone wyล‚ฤ…cznie do uลผytku wewnฤ…trz klasy. Nie sฤ… dostฤ™pne dla klasy odziedziczonej.

W przypadku modyfikatorรณw dostฤ™pu chronionego elementy sฤ… przeznaczone do uลผytku wewnฤ…trz klasy i klasy dziedziczonej i nie sฤ… dostฤ™pne z poziomu obiektu klasy.

Przykล‚ad:

class Person {
    protected name: string;
    protected age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    private getName(): string {
        return this.name;
    }

    getDetails(): string {
        return "Name is " + this.getName();
    }
}

class Student extends Person {
    tmarks: number;
    constructor(name: string, age: number, tmarks: number) {
        super(name, age);
        this.tmarks = tmarks;
    }
    getMarks(): number {
        return this.tmarks;
    }

    getFullName(): string {
        return this.name;
    }

    setMarks(tmarks) {
        this.tmarks = tmarks;
    }
}

let _std1 = new Student('Sheena', 24, 500);
_std1.getMarks();    // output is 500
_std1.getFullName(); // output is Sheena
_std1.getDetails();  // output is Name is Sheena
zmiana Sama klasa Klasa pochodna Obiekt klasy
publiczny Tak Tak Tak
chroniony Tak Tak Nie
prywatny Tak Nie Nie

Interfejs w TypeScript

Jedna z podstawowych cech TypeScript Interfejsy to zbiรณr reguล‚, ktรณre muszฤ… zostaฤ‡ zaimplementowane przez jednostkฤ™, ktรณra go uลผywa. Jednostkฤ… moลผe byฤ‡ klasa, funkcja lub zmienna. Interfejs moลผe skล‚adaฤ‡ siฤ™ z wล‚aล›ciwoล›ci i metod. Wล‚aล›ciwoล›ฤ‡ lub metodฤ™ moลผna oznaczyฤ‡ jako opcjonalnฤ…, uลผywajฤ…c skล‚adni โ€ž?โ€. Interfejs dodaje silne sprawdzenie typu dla kaลผdej funkcji, zmiennej lub klasy, ktรณra go implementuje.

Skล‚adnia interfejsu w TypeScript

interface Dimension {
    width: string;
    height: string;
}

Zdefiniowaล‚eล› interfejs o nazwie Dimension, ktรณry ma wล‚aล›ciwoล›ci width i height, obie typu string.

Ten interfejs moลผna zaimplementowaฤ‡ za pomocฤ… zmiennej, funkcji lub klasy. Oto przykล‚ad zmiennej implementujฤ…cej interfejs Dimension.

Przykล‚ad:

interface Dimension {
    width: string;
    height: string;
}

let _imagedim: Dimension = {
    width: "100px",
    height: "200px"
};

Sygnatura interfejsu Dimension ma szerokoล›ฤ‡ i wysokoล›ฤ‡, a oba sฤ… obowiฤ…zkowe. Pominiฤ™cie jakiejkolwiek wล‚aล›ciwoล›ci lub zmiana typu spowoduje bล‚ฤ…d kompilacji podczas kompilacji kodu. JavaScenariusz.

Powyลผszy kod po skompilowaniu JavaSkrypt wyglฤ…da nastฤ™pujฤ…co:

var _imagedim = {
    width: "100px",
    height: "200px"
};

Zobaczmy teraz, jak uลผywaฤ‡ interfejsu z funkcjฤ….

Uลผywanie interfejsu w funkcji jako typu zwracanego

interface Dimension {
    width: string;
    height: string;
}

function getDimension() : Dimension {
    let width = "300px";
    let height = "250px";
    return {
        width: width,
        height: height
    }
}

W powyลผszym przykล‚adzie interfejs Dimension jest uลผywany jako typ zwracany przez funkcjฤ™ getDimension(). Wartoล›ฤ‡ zwracana musi byฤ‡ zgodna z wล‚aล›ciwoล›ciami i typami zadeklarowanymi w interfejsie.

Skompilowany JavaKod skryptu bฤ™dzie wyglฤ…daล‚ nastฤ™pujฤ…co:

function getDimension() {
    var width = "300px";
    var height = "250px";
    return {
        width: width,
        height: height
    };
}

Jeล›li podczas kompilacji typ zwracany nie bฤ™dzie odpowiadaล‚ interfejsowi, zostanie zgล‚oszony bล‚ฤ…d.

Interfejs jako parametr funkcji

interface Dimension {
    width: string;
    height: string;
}

function getDimension(dim: Dimension) : string {
    let finaldim  = dim.width + "-" + dim.height;
    return finaldim;
}

getDimension({width:"300px", height:"250px"}); // "300px-250px"

W powyลผszym przykล‚adzie uลผyto interfejsu Dimension jako parametru funkcji getDimension(). Po wywoล‚aniu funkcji przekazywany do niej parametr musi byฤ‡ zgodny z reguล‚ami zdefiniowanymi przez interfejs.

Skompilowany JavaKod skryptu bฤ™dzie wyglฤ…daล‚ nastฤ™pujฤ…co:

function getDimension(dim) {
    var finaldim = dim.width + "-" + dim.height;
    return finaldim;
}
getDimension({ width: "300px", height: "250px" });

Klasa implementujฤ…ca interfejs

Aby skorzystaฤ‡ z interfejsu z klasฤ…, naleลผy uลผyฤ‡ sล‚owa kluczowego narzฤ™dzia.

Skล‚adnia klasy implementujฤ…cej interfejs:

class NameofClass implements InterfaceName {
}

Poniลผszy przykล‚ad pokazuje interfejs dziaล‚ajฤ…cy z klasฤ….

interface Dimension {
    width : string,
    height: string,
    getWidth(): string;
}

class Shapes implements Dimension {
    width: string;
    height: string;
    constructor (width:string, height:string) {
        this.width = width;
        this.height = height;
    }
    getWidth() {
        return this.width;
    }
}

W powyลผszym przykล‚adzie zdefiniowano interfejs Dimension z wล‚aล›ciwoล›ciami width i height, obie typu string, oraz metodฤ… o nazwie getWidth(), ktรณra zwraca string.

Skompilowany JavaKod skryptu bฤ™dzie wyglฤ…daล‚ nastฤ™pujฤ…co:

var Shapes = /** @class */ (function () {
    function Shapes(width, height) {
        this.width = width;
        this.height = height;
    }
    Shapes.prototype.getWidth = function () {
        return this.width;
    };
    return Shapes;
}());

Funkcje w TypeScript

Funkcje to zestawy instrukcji wykonywanych w celu wykonania zadania. W JavaW skrypcie wiฤ™kszoล›ฤ‡ kodu jest napisana w formie funkcji i odgrywajฤ… one waลผnฤ… rolฤ™. TypeScript Masz dostฤ™pne klasy, interfejsy, moduล‚y i przestrzenie nazw, ale funkcje nadal odgrywajฤ… waลผnฤ… rolฤ™. Rรณลผnica miฤ™dzy funkcjฤ… w JavaSkrypt i TypeScript to typy parametrรณw i zwracane dostฤ™pne w TypeScript funkcja.

JavaFunkcja skryptu:

function add (a1, b1) {
   return a1+b1;
}

TypeScript funkcjonowaฤ‡:

function  add(a1 : number, b1: number) : number {
    return a1 + b1;
}

W powyลผszej funkcji nazwa funkcji to add, a parametry to a1 oraz b1, oba typu liczbowego, a typem zwracanym jest rรณwnieลผ liczba. Jeล›li przekaลผesz ciฤ…g znakรณw do funkcji, zgล‚osi ona bล‚ฤ…d kompilacji podczas kompilacji do JavaScenariusz.

Wywoล‚anie funkcji: add

let x = add(5, 10);   // will return 15
let b = add(5);       // error TS2554: Expected 2 arguments, but got 1
let c = add(3,4,5);   // error TS2554: Expected 2 arguments, but got 3
let t = add("Harry", "John");
// error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'

Parametry a1 oraz b1 Sฤ… obowiฤ…zkowe i ich niepodanie spowoduje bล‚ฤ…d. Typy parametrรณw i typ zwracany sฤ… rรณwnie waลผne i nie moลผna ich zmieniฤ‡ po zdefiniowaniu.

Opcjonalne parametry funkcji

In JavaSkrypt, wszystkie parametry funkcji sฤ… opcjonalne i sฤ… uznawane za niezdefiniowane, jeล›li nie zostanฤ… przekazane. To samo nie dotyczy TypeScriptPo zdefiniowaniu parametrรณw naleลผy je podaฤ‡. Jeล›li chcesz, aby parametr byล‚ opcjonalny, dodaj znak zapytania po nazwie parametru, jak pokazano poniลผej:

function getName(firstname: string, lastname?: string): string {
    return firstname + lastname;
}

let a = getName("John");              // returns Johnundefined
let b = getName("John", "Harry");     // returns JohnHarry
let c = getName("John", "H", "Harry"); // error TS2554: Expected 1-2 arguments, but got 3

Naleลผy pamiฤ™taฤ‡, ลผe parametry opcjonalne muszฤ… zostaฤ‡ zdefiniowane na koล„cu. Pierwszy parametr nie moลผe byฤ‡ opcjonalny, a drugi obowiฤ…zkowy, poniewaลผ kompilator nie wiedziaล‚by, ktรณra wartoล›ฤ‡ zostaล‚a podana.

Przypisz wartoล›ci domyล›lne do parametrรณw

Moลผesz przypisaฤ‡ parametrom wartoล›ci domyล›lne, jak pokazano poniลผej:

function getName(firstname: string, lastname = "Harry"): string {
    return firstname + lastname;
}

let a = getName("John");      // will return JohnHarry
let b = getName("John", "H"); // will return JohnH

Podobnie jak w przypadku parametrรณw opcjonalnych, domyล›lne zainicjowane parametry muszฤ… zostaฤ‡ umieszczone na koล„cu listy parametrรณw.

Parametry spoczynkowe

Widziaล‚eล› jak TypeScript Obsล‚uguje parametry obowiฤ…zkowe, parametry opcjonalne i parametry wartoล›ci domyล›lnych. Teraz przyjrzymy siฤ™ parametrom resztowym. Parametry resztowe to grupa parametrรณw opcjonalnych zdefiniowanych razem, przy uลผyciu trzech kropki (โ€ฆ) po ktรณrej nastฤ™puje nazwa parametru, ktรณry jest tablicฤ….

Skล‚adnia parametrรณw spoczynkowych:

function testFunc(a: string, ...arr: string[]) :string {
    return a + arr.join("");
}

Jak pokazano powyลผej, parametr rest to tablica poprzedzona trzema kropkami. Tablica bฤ™dzie zawieraฤ‡ wszystkie pozostaล‚e argumenty przekazane do funkcji.

Przykล‚ad:

let a = testFunc("Monday", "Tuesday", "Wednesday", "Thursday");
// output is MondayTuesdayWednesdayThursday

Funkcje strzaล‚ek

Funkcja strzaล‚ki to jedna z waลผnych funkcji udostฤ™pnionych w ES6 i jest dostฤ™pna w TypeScript teลผ. W skล‚adni jest gruba strzaล‚ka, od ktรณrej pochodzi nazwa.

Funkcja strzaล‚kowa Skล‚adnia:

var nameoffunction = (params) => {
 // code here
}

Do czego sล‚uลผy funkcja strzaล‚kowa?

Przyjrzyjmy siฤ™ przykล‚adowi, aby zrozumieฤ‡ przypadek uลผycia funkcji strzaล‚kowej.

Przykล‚ad:

var ScoreCard = function () {
    this.score = 0;

    this.getScore = function () {
        setTimeout(function () {
            console.log(this.score);    // gives undefined
        }, 1000);
    }
}

var a = new ScoreCard();
a.getScore();

Utworzyล‚eล› funkcjฤ™ z wล‚aล›ciwoล›ciฤ… score zainicjowanฤ… wartoล›ciฤ… 0 oraz metodฤ… getScore, ktรณra wewnฤ™trznie uลผywa setTimeout i po jednej sekundzie rejestruje this.score. Zalogowana wartoล›ฤ‡ jest niezdefiniowana, mimo ลผe this.score jest zdefiniowane i zainicjowane. Problem leลผy w to Sล‚owo kluczowe. Funkcja wewnฤ…trz setTimeout ma wล‚asne this, a poniewaลผ score nie jest w niej zdefiniowany, wynik jest niezdefiniowany.

To samo moลผna zrobiฤ‡ za pomocฤ… funkcji strzaล‚kowej, jak pokazano poniลผej:

var ScoreCard = function () {
    this.score = 0;

    this.getScore = function () {
        setTimeout(() => {
            console.log(this.score);   // you get 0
        }, 1000);
    }
}

var a = new ScoreCard();
a.getScore();

Funkcja strzaล‚kowa nie ma wล‚asnej to, a zamiast tego wspรณล‚dzieli zmiennฤ… z zakresu nadrzฤ™dnego, wiฤ™c zmienne zadeklarowane poza zakresem sฤ… dostฤ™pne za pomocฤ… this w funkcji strzaล‚kowej. Sฤ… one przydatne ze wzglฤ™du na krรณtszฤ… skล‚adniฤ™, a takลผe w przypadku wywoล‚aล„ zwrotnych, procedur obsล‚ugi zdarzeล„ i funkcji czasowych.

TypeScript Enums

A TypeScript enum to obiekt przechowujฤ…cy zbiรณr powiฤ…zanych ze sobฤ… wartoล›ci, przechowywanych razem. JavaSkrypt nie obsล‚uguje natywnie typรณw wyliczeniowych. Wiฤ™kszoล›ฤ‡ jฤ™zykรณw programowania, takich jak Java, C i C++ obsล‚uguje wyliczenia i TypeScript udostฤ™pnia je rรณwnieลผ. Wyliczenia definiuje siฤ™ za pomocฤ… sล‚owa kluczowego enum.

Jak zadeklarowaฤ‡ Enum?

Skล‚adnia:

enum NameofEnum {
   value1,
   value2,
    ..
}

Przykล‚ad: Wyliczenie

enum Directions {
    North,
    South,
    East,
    West
}

W powyลผszym przykล‚adzie zdefiniowano wyliczenie o nazwie โ€žDrogiโ€ z wartoล›ciami โ€žPรณล‚nocโ€, โ€žPoล‚udnieโ€, โ€žWschรณdโ€ i โ€žZachรณdโ€. Wartoล›ci sฤ… numerowane od 0 dla pierwszego wpisu i zwiฤ™kszajฤ… siฤ™ o 1 dla kaลผdego kolejnego wpisu.

Deklarowanie wyliczenia z wartoล›ciฤ… liczbowฤ…

Domyล›lnie, jeล›li elementowi wyliczenia nie zostanie podana wartoล›ฤ‡, przyjmuje on liczbฤ™, zaczynajฤ…c od 0. Poniลผszy przykล‚ad pokazuje wyliczenie z jawnymi wartoล›ciami liczbowymi.

enum Directions {
North = 0,
South = 1,
East = 2,
West = 3
}

Moลผesz rรณwnieลผ przypisaฤ‡ wartoล›ฤ‡ poczฤ…tkowฤ…, a kolejne elementy otrzymajฤ… wartoล›ci zwiฤ™kszone. Na przykล‚ad:

enum Directions {
North = 5,
South, // will be 6
East,  // 7
West   // 8
}

Pรณล‚noc zaczyna siฤ™ od 5, wiฤ™c Poล‚udnie ma 6, Wschรณd 7, a Zachรณd 8.

Zamiast wartoล›ci domyล›lnych moลผesz rรณwnieลผ przypisaฤ‡ wartoล›ci wedล‚ug wล‚asnego wyboru. Na przykล‚ad:

enum Directions {
North = 5,
South = 4,
East = 6,
West = 8
}

Jak uzyskaฤ‡ dostฤ™p do Enum?

Poniลผszy przykล‚ad pokazuje, jak uลผywaฤ‡ wyliczeล„ w kodzie:

enum Directions {
    North,
    South,
    East,
    West
}

console.log(Directions.North);      // output is 0
console.log(Directions["North"]); // output is 0
console.log(Directions[0]);       // output is North

Skompilowany JavaSkrypt wyglฤ…da nastฤ™pujฤ…co:

var Directions;
(function (Directions) {
    Directions[Directions["North"] = 0] = "North";
    Directions[Directions["South"] = 1] = "South";
    Directions[Directions["East"] = 2] = "East";
    Directions[Directions["West"] = 3] = "West";
})(Directions || (Directions = {}));
console.log(Directions.North);
console.log(Directions["North"]);
console.log(Directions[0]);

Poniewaลผ JavaSkrypt nie obsล‚uguje wyliczeล„, kompilator konwertuje wyliczenie na funkcjฤ™ samowywoล‚ujฤ…cฤ…, jak pokazano powyลผej. Podwรณjne przypisanie tworzy mapฤ™ odwrotnฤ….ping od numeru z powrotem do nazwy.

Deklarowanie wyliczenia z wartoล›ciฤ… ciฤ…gu

Moลผesz przypisaฤ‡ wybrane przez siebie wartoล›ci ciฤ…gรณw, jak pokazano w poniลผszym przykล‚adzie.

Przykล‚ad:

enum Directions {
    North = "N",
    South = "S",
    East = "E",
    West = "W"
}

console.log(Directions.North);      // output is N
console.log(Directions["North"]); // output is N
console.log(Directions[0]);       // output is undefined

Skompilowany JavaSkrypt wyglฤ…da nastฤ™pujฤ…co:

var Directions;
(function (Directions) {
    Directions["North"] = "N";
    Directions["South"] = "S";
    Directions["East"] = "E";
    Directions["West"] = "W";
})(Directions || (Directions = {}));
console.log(Directions.North);
console.log(Directions["North"]);
console.log(Directions[0]);

โš ๏ธ Ostrzeลผenie: Wyliczenia ล‚aล„cuchowe nie majฤ… mapy odwrotnejpingPorรณwnaj dwa powyลผsze skompilowane wyniki: wyliczenie numeryczne przechowuje dane w obu kierunkach, podczas gdy wyliczenie ล‚aล„cuchowe przechowuje tylko dane od nazwy do wartoล›ci. Dlatego Directions[0] zwraca wartoล›ฤ‡ undefined dla ciฤ…gu wyliczeniowego.

W czym znajdujฤ… siฤ™ moduล‚y TypeScript?

Pliki utworzone w TypeScript Majฤ… dostฤ™p globalny, co oznacza, ลผe โ€‹โ€‹zmienne zadeklarowane w jednym pliku sฤ… dostฤ™pne w innym pliku. Ten globalny charakter moลผe powodowaฤ‡ konflikty kodu i problemy w czasie wykonywania. Funkcjonalnoล›ฤ‡ moduล‚รณw eksportu i importu moลผe byฤ‡ wykorzystana do unikniฤ™cia konfliktรณw zmiennych globalnych i funkcji. Ta funkcja pojawiล‚a siฤ™ wโ€ฆ JavaSkrypt z wydaniem ES6, ktรณry jest rรณwnieลผ obsล‚ugiwany w TypeScript.

Dlaczego potrzebujesz moduล‚รณw w TypeScript?

Poniลผszy przykล‚ad ilustruje problem bez moduล‚รณw.

Przykล‚adowy test1.ts

let age : number = 25;

Zdefiniowaล‚eล› zmiennฤ… wiek numeru typu w test1.ts.

Przykล‚adowy test2.ts

W pliku test2.ts moลผna uzyskaฤ‡ dostฤ™p do zmiennej wiek zdefiniowano w test1.ts i zmodyfikowano go, jak pokazano poniลผej:

age = 30; // changed from 25 to 30.
let _new_age = age;

Moลผe to stwarzaฤ‡ wiele problemรณw, poniewaลผ zmienne sฤ… dostฤ™pne globalnie i moลผna je modyfikowaฤ‡ z dowolnego miejsca.

Z Moduล‚yNapisany kod pozostaje lokalny dla pliku i nie moลผna uzyskaฤ‡ do niego dostฤ™pu spoza niego. Aby udostฤ™pniฤ‡ cokolwiek z pliku, naleลผy go wyeksportowaฤ‡ za pomocฤ… sล‚owa kluczowego export. Export uลผywa siฤ™, gdy zmienna, klasa, funkcja lub interfejs ma byฤ‡ uลผyta w innym pliku. import Sล‚uลผy do uzyskiwania dostฤ™pu do wyeksportowanego elementu. Dziฤ™ki temu kod pozostaje nienaruszony w pliku i nawet jeล›li zdefiniujesz te same nazwy zmiennych, nie zostanฤ… one pomylone.

Korzystanie z eksportu i importu

Istnieje wiele sposobรณw eksportowania i importowania. Omรณwimy skล‚adniฤ™, ktรณra jest najczฤ™ล›ciej uลผywana.

Skล‚adnia importu i eksportu 1:

export  nameofthevariable or class name or interface name etc

//To import the above variable or class name or interface you have to use import as shown below:

import {nameofthevariable or class name or interfacename} from "file path here without .ts"

Oto dziaล‚ajฤ…cy przykล‚ad wykorzystania eksportu i importu.

test1.ts

export let age: number = 25;

Sล‚owo kluczowe export sล‚uลผy do udostฤ™pniania zmiennej wieku innemu plikowi.

test2.ts

import { age } from "./test1"
let new_age :number = age;

Sล‚owo kluczowe import sล‚uลผy do uzyskania dostฤ™pu do wiek zmiennฤ… i musisz okreล›liฤ‡ lokalizacjฤ™ pliku, jak pokazano powyลผej.

Skล‚adnia importu i eksportu 2:

Istnieje inny sposรณb eksportowania i importowania, ktรณrego skล‚adnia jest przedstawiona poniลผej:

export = classname;

import classname = require("file path of modulename")

Kiedy uลผywasz eksport = Aby wyeksportowaฤ‡ moduล‚, naleลผy uลผyฤ‡ polecenia importu (โ€žล›cieลผka pliku modulenameโ€).

Oto dziaล‚ajฤ…cy przykล‚ad ilustrujฤ…cy ten przypadek.

Klient.ts

class Customer {
    name: string;
    age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    getName(): string {
        return this.name;
    }
}

export = Customer;

testKlient.ts

import Customer = require("./Customer");

let a = new Customer("Harry", 30);
alert(a.getName());

Moduล‚ ล‚adujฤ…cy

Moduล‚y nie mogฤ… dziaล‚aฤ‡ samodzielnie, dlatego potrzebny jest program ล‚adujฤ…cy moduล‚y, aby zlokalizowaฤ‡ zaleลผnoล›ci importu, jak pokazano w TypeScript Przykล‚ady powyลผej. Dostฤ™pne sฤ… moduล‚y ล‚adujฤ…ce CommonJS dla Nodejs i Require.js do uruchamiania w przeglฤ…darce.

Aby skompilowaฤ‡ kod przy uลผyciu formatu moduล‚u CommonJS, uลผyj nastฤ™pujฤ…cego polecenia:

tsc --module commonjs testCustomer.ts

Aby skompilowaฤ‡ kod przy uลผyciu formatu moduล‚u Requirejs, uลผyj nastฤ™pujฤ…cego polecenia:

tsc --module amd testCustomer.ts

Za pomocฤ… powyลผszego polecenia pliki zaleลผne zostanฤ… przekonwertowane na pliki js.

Przykล‚adowy plik testCustomer.ts do pliku testCustomer.js przy uลผyciu Requirejs

define(["require", "exports", "./Customer"], function (require, exports, Customer) {
    "use strict";
    exports.__esModule = true;
    var a = new Customer("Harry", 30);
    alert(a.getName());
});

Przykล‚adowy plik Customer.ts do Customer.js przy uลผyciu Requirejs

define(["require", "exports"], function (require, exports) {
    "use strict";
    var Customer = /** @class */ (function () {
        function Customer(name, age) {
            this.name = name;
            this.age = age;
        }
        Customer.prototype.getName = function () {
            return this.name;
        };
        return Customer;
    }());
    return Customer;
});

Aby przetestowaฤ‡ dziaล‚anie require.js, naleลผy utworzyฤ‡ plik o nazwie main.js, ktรณry odwoล‚uje siฤ™ do zaleลผnoล›ci w sposรณb pokazany poniลผej.

Oto struktura folderรณw:

src/
    Customer.js
    testCustomer.js
    main.js
    require.js  // you can get this file from github or npm install requirejs
    test.html

main.js

define(function (require) {
    var customer = require("./Customer");
    var testCustomer = require("./testCustomer");
});

test.html

<!DOCTYPE html>
<html>
<head>
    <title>TypeScript Module testing using Requirejs</title>
    <script data-main="main" src="require.js"></script>
</head>
<body>
    <h3>Testing modules using Requirejs</h3>
</body>
</html>

Moduล‚ ล‚adujฤ…cy

Przestrzenie nazw w TypeScript

Przestrzeล„ nazw przechowuje zbiรณr klas, interfejsรณw, zmiennych i funkcji w jednym pliku.

Skล‚adnia przestrzeni nazw

namespace name{

export class {
}

export interface {
}

export const constname;

}

Powiฤ…zany kod jest dostฤ™pny w jednej przestrzeni nazw.

Przykล‚ad dziaล‚ania przestrzeni nazw: testnamespace.ts

namespace StudentSetup {

    export interface StudDetails {
        name: string;
        age: number;
    }

    export function addSpace(str) { // will add space to the string given
        return str.split("").join(" ");
    }

    export class Student implements StudDetails {
        name: string;
        age: number;

        constructor(studentdetails: StudDetails) {
            this.name = studentdetails.name;
            this.age = studentdetails.age;
        }

        getName(): string {
            return this.name;
        }
    }
}

Nazwa przestrzeni nazw to Konfiguracja studentai dodaล‚eล› interfejs StudDetails, funkcjฤ™ addSpace i klasฤ™ o nazwie Student.

Dostฤ™p do przestrzeni nazw

Poniลผej znajduje siฤ™ kod, w ktรณrym uลผywasz przestrzeni nazw Konfiguracja studenta.

testStudentSetup.ts

let a = new StudentSetup.Student({ name: "Harry", age: 20 });

console.log("The name is :" + StudentSetup.addSpace(a.getName()));

Do klasy, interfejsu lub funkcji dostฤ™pnej w przestrzeni nazw naleลผy odwoล‚ywaฤ‡ siฤ™ za pomocฤ… nazwy przestrzeni nazw, na przykล‚ad StudentSetup.addSpace aby uzyskaฤ‡ dostฤ™p do funkcji i Konfiguracja ucznia. Student aby uzyskaฤ‡ dostฤ™p do klasy.

Moลผesz skompilowaฤ‡ oba pliki do jednego pliku js, jak pokazano poniลผej:

tsc --outFile namespace.js testnamespace.ts  testStudentSetup.ts

Sprawdลบ wynik w wierszu poleceล„, korzystajฤ…c z poniลผszego polecenia:

node namespace.js

Wyjล›cie:

The name is :H a r r y

Deklaracje otoczenia w TypeScript

TypeScript pozwala na korzystanie z usล‚ug stron trzecich JavaPliki skryptรณw z wykorzystaniem deklaracji ambient. Zaletฤ… tej funkcji jest to, ลผe nie trzeba przepisywaฤ‡ biblioteki, a mimo to moลผna korzystaฤ‡ ze wszystkich jej funkcji z weryfikacjฤ… typu. TypeScript.

Skล‚adnia otoczenia

Aby zadeklarowaฤ‡ moduล‚ ambient:

declare module moduleName {
   //code here
}

Plik ambient naleลผy zapisaฤ‡ jako:

filename.d.ts

Aby skorzystaฤ‡ z pliku nazwapliku.d.ts w pliku .ts naleลผy odwoล‚aฤ‡ siฤ™ do niego w nastฤ™pujฤ…cy sposรณb:

/// <reference path="filename.d.ts"/>

Deklaracja typu otoczenia w TypeScript odwoล‚uje siฤ™ do biblioteki innej firmy i ponownie deklaruje wymagane funkcje, uลผywajฤ…c wล‚asnych typรณw. Rozwaลผmy na przykล‚ad maล‚y JavaPoniลผej znajduje siฤ™ biblioteka skryptรณw.

Third Party JavaPlik skryptu: testString.js

var StringChecks = {
    isString: function (str) {
        return typeof str === "string";
    },

    convertToUpperCase: function (str) {
        return str.toUpperCase();
    },

    convertToLowerCase: function (str) {
        return str.toLowerCase();
    },

    convertToStringBold: function (str) {
        return str.bold();
    }
};

Masz obiekt o nazwie StringChecks, ktรณry ma funkcje isString, convertToUpperCase, convertToLowerCase i convertToStringBold.

Tworzenie moduล‚u otoczenia w TypeScript

Teraz utworzymy moduล‚ ambient, ktรณry odwoล‚uje siฤ™ do JavaSkrypt dziaล‚a jak opisano powyลผej i w razie potrzeby dodaje sprawdzenie typu.

Nazwa pliku: tstring.d.ts

declare module TestString {

    export interface StringsFunc {
        isString(str: string): boolean;
        convertToUpperCase(str: string): string;
        convertToLowerCase(str: string): string;
        convertToStringBold(str: string): string;
    }
}

declare var StringChecks: TestString.StringsFunc;

Definiujesz moduล‚ o nazwie TestString i eksportujesz interfejs StringsFunc. Kaลผdy podpis okreล›la, co funkcja akceptuje i zwraca:

  • isString(str:string): wartoล›ฤ‡ logiczna โ€“ przyjmuje ciฤ…g znakรณw i zwraca wartoล›ฤ‡ logicznฤ…. Przekazanie liczby lub innego typu powoduje bล‚ฤ…d kompilacji.
  • convertToUpperCase(str: string): string โ€“ przyjmuje ciฤ…g znakรณw i zwraca ciฤ…g znakรณw.
  • convertToLowerCase(str: string): string โ€“ przyjmuje ciฤ…g znakรณw i zwraca ciฤ…g znakรณw.
  • konwertujToStringBold(str:string): ciฤ…g โ€“ przyjmuje ciฤ…g znakรณw i zwraca ciฤ…g znakรณw.

Poniewaลผ JavaPlik skryptu ujawnia nazwฤ™ obiektu StringChecks, do tej samej nazwy odwoล‚ujemy siฤ™ ostatecznie w pliku .d.ts:

declare var StringChecks: TestString.StringsFunc;

Korzystanie z moduล‚u Ambient w TypeScript

Oto plik test.ts, ktรณry wykorzystuje plik ambient tstring.d.ts.

/// <reference path="tstring.d.ts"/>
let str1 = StringChecks.isString("Hello World");
console.log(str1);
let str2 = StringChecks.convertToUpperCase("hello world");
console.log(str2);
let str3 = StringChecks.convertToLowerCase("HELLO");
console.log(str3);
let str4 = StringChecks.convertToStringBold("Hello World");
console.log(str4);

Kompiluj za pomocฤ… tsc test.ts, aby utworzyฤ‡ test.js:

/// <reference path="tstring.d.ts"/>
var str1 = StringChecks.isString("Hello World");
console.log(str1);
var str2 = StringChecks.convertToUpperCase("hello world");
console.log(str2);
var str3 = StringChecks.convertToLowerCase("HELLO");
console.log(str3);
var str4 = StringChecks.convertToStringBold("Hello World");
console.log(str4);

Teraz moลผesz uลผywaฤ‡ pliku test.js w pliku HTML razem z plikiem biblioteki testString.js.

<html>
<head>
    <title>Test TypeScript Ambient</title>
    <script src="testString.js"></script>
    <script src="test.js"></script>
</head>
<body>
</body>
</html>

Wyjล›cie:

true
HELLO WORLD
hello
<b>Hello World</b>

๐Ÿ’ก Wskazรณwka: W przypadku popularnych bibliotek rzadko trzeba samodzielnie pisaฤ‡ plik .d.ts. Zamiast tego zainstaluj typy zarzฤ…dzane przez spoล‚ecznoล›ฤ‡, na przykล‚ad. npm install --save-dev @types/lodash, a kompilator automatycznie je wychwytuje.

Aby kontynuowaฤ‡, porรณwnaj bezpoล›rednio oba jฤ™zyki TypeScript vs JavaScenariusz, ponownie odwiedziฤ‡ JavaMetody tablicowe skryptรณw w przypadku nietypowanych odpowiednikรณw uลผytych tutaj i przestudiuj zapฤ™tla siฤ™ JavaScenariusz oraz wewnฤ™trzny i zewnฤ™trzny JavaScenariusz w przypadku podstawowych funkcji przeglฤ…darki, na ktรณrych opiera siฤ™ skompilowany wynik.

FAQ

Nie. Przeglฤ…darka wykonuje JavaTylko skrypt, wiฤ™c plik .ts musi zostaฤ‡ najpierw skompilowany za pomocฤ… tsc lub bundlera. Adnotacje typu sฤ… usuwane na tym etapie i nie powodujฤ… ลผadnych kosztรณw w czasie wykonywania.

Tak. Wล‚ฤ…cz allowJs w pliku tsconfig.json i zmieniaj nazwy plikรณw pojedynczo. Poniewaลผ kaลผdy JavaPlik skryptu jest juลผ prawidล‚owy TypeScript, projekt jest kompilowany przez caล‚y czas migracji.

Interfejs moลผna ponownie otwieraฤ‡ i rozszerzaฤ‡, co jest powszechnym wyborem dla ksztaล‚tรณw obiektรณw. Alias โ€‹โ€‹typu obejmuje rรณwnieลผ unie, krotki i prymitywy, ktรณrych interfejsy nie mogฤ… wyraziฤ‡.

Uลผywaj moduล‚รณw z eksportem i importem. Przestrzenie nazw sฤ… starsze niลผ moduล‚y ES i nadal sฤ… przydatne gล‚รณwnie w plikach deklaracji i starszych bazach kodu opartych na skryptach.

Tak, mierzalnie. Kompilator natychmiast odrzuca wล‚aล›ciwoล›ci halucynogenne i bล‚ฤ™dne typy argumentรณw, wiฤ™c wygenerowany fragment kodu albo sprawdza typ, albo dokล‚adnie raportuje, gdzie jest bล‚ฤ™dny.

Integracje edytorรณw wprowadzajฤ… otaczajฤ…ce typy i pliki .d.ts do kontekstu modelu. Bogatsze adnotacje zapewniajฤ… zatem dokล‚adniejsze uzupeล‚nienia niลผ kod o luลบnym typowaniu.

Podsumuj ten post nastฤ™pujฤ…co: