[[oktatas:web:typescript|< TypeScript]] ====== TypeScript ====== * **Szerző:** Sallai András * Copyright (c) 2021, Sallai András * Szerkesztve: 2021, 2022, 2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== A TypeScriptről ===== A TypeScript a Microsoft által megalkotott programozási nyelv. A JavaScript egy szigorított részhalmazának is tekinthető. A TypeScript segíti a programozót, hogy jobb kódot írjon. {{:oktatas:web:typescript:ts_es6_es5.png?400|}} A TypeScript nyelven írt kódot egy fordítóval JavaScript kódra fordítjuk és így használjuk. A TypesSript programkódot .ts kiterjesztésű fájlba írjuk. {{:oktatas:web:typescript:typescript.png|}} Támogatja az ES6 szaványt. A TypeScript állományok kiterjesztése: .ts ===== Helló világ ===== Írjunk egy app.ts nevű fájlban egy programot. Írassuk ki a "Helló Világ" üzenetet. console.log('Helló Világ'); Fordítsuk le JavaScript kódra: tsc app.ts Az eredmény egy app.js nevű fájl: console.log('Helló Világ'); Futtatás: node app.js Böngészőből is futtathatjuk ha készítünk egy weblapot, például index.html néven. TypeScript A script elem defer attribútuma biztosítja, hogy a script csak a weblap betöltése után fusson le. A JavaScript kimenetét a fejlesztői felületen nézhetjük még: F12 ===== lite-server ===== Használhatjuk a lite-server csomagot a weblap megtekintéséhez. Ehhez kezdésnek készítsük elő a projekt könyvtárat: npm init -y Telepítsük a lite-server-t fejlesztéshez: npm install --save-dev lite-server Telepítés után a **devDependencies** szekcióba bekerült a **lite-server**: { "devDependecies": { "lite-server": "^2.5.4" } } Írjunk indítósort a **package.json** fájlba: { "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "lite-server" }, "devDependecies": { "lite-server": "^2.5.4" } } A lite-server indítása: npm start ===== Projekt készítés ===== mkdir app01 cd app01 code . Ha beléptünk az app01 könyvtárba indítsuk el a VSCodium vagy a VSCode szerkesztőt. Indítsunk egy terminált. Ha készítünk az src könyvtárban egy app.ts könyvtárat lefordíthatjuk azt: tsc src/app.ts Ha több .ts kiterjesztésű állományunk van, készítsük tsconfig.json beállítófájlt: { "compilerOptions": { "rootDir": "src" } } Készítsünk NodeJS projektet. npm init -y A keletkezett package.json fájt nyissuk meg. "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "tsc", } Írjunk egy build feladatot, majd használjuk így: npm build ===== Típusok ===== * number * string * boolean * array * tuple * void * enum A TypeScriptben úgynevezett **annotációval** jelöljük a változók, állandók, függvények, objektumok típusát. A változó (vagy más dolog) után egy : (kettőspont) következik, utána jön a típus. ==== Számok ==== var dec: number = 345; var hex: number = 0xf7; var bin: number = 0b0100; var oct: number = 0o25; console.log(dec); console.log(hex); console.log(bin); console.log(oct); A deklarálás helyén nem kötelező definiálni az értéket: var dec: number; dec = 345; Ha értéket adunk egy változónak, akkor nem kötelező a típust megadni: var dec = 345; let dec = 300; console.log(dec.toExponential()); //1.234567e+6 ==== Formázás ==== A **toExponential()** függvény egy szám hatványkitevős alakjával tér vissza. Megadható paraméter is, amely megmondja tizedespont után hány tizedesjegy jelenjen meg: let dec = 1234567; console.log(dec.toExponential(1)); // 1.2e+6 console.log(dec.toExponential(2)); // 1.23e+6 console.log(dec.toExponential(3)); // 1.235+6 console.log(dec.toExponential(4)); // 1.2346e+6 console.log(dec.toExponential(5)); // 1.23457e+6 A **toFixed()** fixpontos alakban adja vissza a számot: let dec = 1.234567e+6; console.log(dec.toFixed()); A **toFixed()** fixpontos számok alakítására is használható. Egy paraméterrel szabályozhatom a tizedesjegyek számát: let dec = 12.34567; console.log(dec.toFixed()); console.log(dec.toFixed(1)); console.log(dec.toFixed(2)); console.log(dec.toFixed(3)); console.log(dec.toFixed(4)); A **toLocaleString()** a helyi területi beállításoknak megfelelően adja vissza a számot. Magyar nyelvű környezetben a tizedpont helyett tizedes vesszőt ír: let dec = 12.34567; console.log(dec.toLocaleString()); //12,346 Megadható a környezet: let dec = 12.34567; console.log(dec.toLocaleString('hu-HU')); //12,346 A **toPrecision()** függvény hatványkitevős vagy fixpontos alakban ad vissza egy számot. Paraméterként megadható a visszadott számjegyek száma: let dec = 123.4567; console.log(dec.toPrecision(1)); // 1e+2 console.log(dec.toPrecision(2)); // 1.2e+2 console.log(dec.toPrecision(3)); // 123 console.log(dec.toPrecision(4)); // 123.5 console.log(dec.toPrecision(5)); // 123.46 console.log(dec.toPrecision(6)); // 123.457 A **toString()** szöveggé alakítja a számot. Paraméterként megadható milyen számrendszerbe adja vissza az értéket: let dec = 12; console.log(dec.toString()); // 12 console.log(dec.toString(2)); // 1100 console.log(dec.toString(5)); // 22 console.log(dec.toString(8)); // 14 console.log(dec.toString(12)); // 10 console.log(dec.toString(16)); // c A **valueOf()** függvény visszatér egy szám primitív értékével. Vegyünk fel egy számot objektumként a **Number()** konstruktorral, majd nézzük meg a típusát: let dec1 = 12; console.log(typeof dec1); let dec2 = new Number(12); console.log(typeof dec2); console.log(typeof dec2.valueOf()); ==== Szöveg ==== Szöveges literálisok létrehozhatók idézőjellel, aposztróffal és ferde aposztróffal (AltGr+7; tompa ékezet). var nev = "János"; var uzenet1 = "Üdvözöllek " + nev; var uzenet2 = 'Üdvözöllek ' + nev; var uzenet3 = `Üdvözöllek ${nev}`; var nev: string = "János"; ==== Logikai típus ==== var letezik: boolean = true; letezik = false; ==== Tömb ==== Számokat tartalmazó tömb: let szamok: number[] = []; szamok.push(12); szamok.push(23); szamok.push(18); console.log(szamok[0]); Karakterláncokat tartalmazó tömb: let nevek: string[] = []; nevek.push('János'); nevek.push('Béla'); nevek.push('Feri'); console.log(nevek[0]); Kezdőérték: let szamok: number[] = [35, 40, 50, 27]; szamok.push(12); console.log(szamok[0]); Különböző típusok: const tomb: (Date| string[]) [] = [new Date(), new Date(), ["a", "b"]]; ==== Tuple ==== A tuple esetén csak a megadott számú elem adható meg: var szamtuple: [number, number, number]; Az értékek később megváltoztathatók: let szamok: [number, number, number] = [35, 40, 50]; console.log(szamok[0]); szamok[0] = 17; console.log(szamok[0]); var szamoktuple : [number, number, number]; szamoktuple = [35, 40, 50]; szamoktuple = [22, 17, 82]; console.log(szamoktuple); ==== Void ==== Az undefined altípusa. Nincs visszatérési érték. let a: void = null; function say(): void { console.log('Helló'); } ==== Never ==== A függvény végét sosem érjük el, sosem lesz visszatérési értéke. function mehet(): never { while(true) { console.log('végtelen'); } } Kétféle függvényben használható: * végtelen ciklus * a függvény hibát dob function valami(): never { throw new Error('Hiba!'); } A never még null értéket sem vehet fel, szemben a void-el: let a: void = null; let b: never = null; //Ez le sem fordul ==== Union ==== Egyszerre két típust is megadhatunk, ez lesz az Union típus. let a: string | number; a = 30; console.log(a); a = 'ábécé'; console.log(a); Logikai típus viszont már nem tehető bele. ==== Any ==== Bármilyen típus lehet benne: let a: any; a = 30; console.log(a); a = 'ábécé'; console.log(a); ==== Enum ==== enum SzovegesEnum { ValasztasA = "A", ValasztasB = "B", } enum Irany { Fel, Le, Balra, Jobbra } var irany: Irany = Irany.Balra; if(irany as Irany == Irany.Jobbra) { console.log('az irány jobb') }else { console.log('Az irány más'); } console.log(typeof irany) if(irany == Irany.Jobbra as number) { } enum Irany { Fel = 'fel', Le = 'le', Balra = 'balra', Jobbra = 'jobbra' } var irany: Irany = Irany.Balra; if(irany == Irany.Jobbra as string) { console.log('az irány jobb') }else { console.log('Az irány más'); } console.log(typeof irany) ==== Típuskényszerítés ==== A típus kényszerítést a <> jelekkel adjuk meg: let a: any = 30; let b = a; console.log(b); ===== Változók és állandók ===== * var - élettartama blokkon belül és globálisan is érvényes * let - élettartama csak adott blokkon belül érvényes * const - mint a let, de csak egyszer inicializálható A változók és az állandók neveire a következő szabályok vonatkoznak: * az ábécé kis- és nagybetűiből állhatnak * nem kezdődhet számjeggyel * lehet benne speciális karakter, például @, $ stb. let szam1 = 30; function szamit() { if(szam1>10) { let szam2 = 35; console.log(szam2); } while(szam1 < 35) { let szam4 = 40; console.log(szam4); szam1++; } console.log(szam1); //Hibás, mivel ebben a hatókörben nincs szam2: //console.log(szam2); //Hibás, mivel ebben a hatókörben nincs szam4: // console.log(szam4); } szamit(); Ha var deklarációra cserélem a változókat, működik: var szam1 = 30; function szamit() { if(szam1>10) { var szam2 = 35; console.log(szam2); } while(szam1 < 35) { var szam4 = 40; console.log(szam4); szam1++; } console.log(szam1); console.log(szam2); console.log(szam4); } szamit(); Ha egy változót nem deklarálunk, akkor hibát ad a fordító. Ha utólag deklaráljuk var kulcsszóval, akkor nem kapunk hibát, de a kiíratás eredménye undefined: console.log(szam1); var szam1 = 30; Ha a let kulcsszót használjuk, akkor nem fordul le a program: console.log(szam1); let szam1 = 30; ===== Megjegyzés ===== // egy soros megjegyzés var a = 35; // egy soros /* több soros megjegyzés */ var b = 40; ===== Szelekció ===== let tortenet = true; if (tortenet) { console.log('igaz'); } Ellenben ág: let tortenet = true; if (tortenet) { console.log('igaz'); }else { console.log('hamis') } Több ág: let szam: number = 35; if (szam > 0) { console.log('pozitív'); }else if(szam < 0) { console.log('negatív'); }else { console.log('nulla'); } Hármas operátor: let szam: number = 30; szam > 0 ? console.log('pozitív') : console.log('negatív vagy 0'); ==== Switch ==== let szam: number = 1; switch(szam) { case 1: { console.log('egy'); break; } case 2: { console.log('kettő'); break; } default: { console.log('ismeretlen szám'); break; } } ===== Iteráció ===== for(let i=0; i<5; i++) { console.log(i); } let szamok = [30, 35, 40]; for(let szam of szamok) { console.log(szam); } let i: number = 0; while (i<5) { console.log(i); i++; } let i = 0; do { console.log(i); i++; }while(i<5); ===== Szövegkezelés ===== Karakterláncokat megadhatunk **aposztrófok**, **idézőjelek** és **tompa ékezetek** között (AltGr+7): var mondat1: string = 'még nyílnak a völgyben'; var mondat2: string = "a kerti virágok"; var mondat3: string = `még zöldel a nyárfa`; A **tompa ékezetek** esetén változó behelyettesítést is használhatunk: var fa: string = 'nyárfa'; var mondat3: string = `még zöldel a ${fa}`; console.log(mondat3); A karakterláncokon futtathatunk függvényeket, amelyek a valamilyen műveletet végeznek az értéken. Példaként vegyük egy karakterlánc egyetlen karakterét, az index hivatkozásával: var szo = 'szilva'; console.log(szo.charAt(0)); // s betűvel tér vissza console.log(szo.charAt(1)); // z betűvel tér vissza Vizsgáljuk meg benne van-e egy karakterlánc a vizsgált karakterláncban: var szo = 'szilva'; console.log(szo.includes('il')); Nézzük meg, milyen indexnél kezdődik egy karakterlánc a vizsgált karakterláncban: var szo = 'szilva'; console.log(szo.indexOf('il')); További függvényeket az alábbi táblázatban találunk: ^ Szövegkezelő függvények ^^ | charAt() | adott indexű karakterrel tér vissza | | charCodeAt() | | | charPointAt() | | | concat() | szövegek kombinációjával tér vissza | | endsWith() | | | includes() | | | indexOf() | keresett rész első előfordulásának indexét adja | | lastIndexOf() | keresett rész utolsó előfordulásának indexe | | localCompare() | | | match() | Mintaillesztés vizsgálat | | normalize() | | padEnd() | | | padStart() | | | repeat() | | | replace() | szöveg cseréje | | search() | | | slice() | | | split() | szövegdarabolása, eredmény tömbben | | startsWith() | | | substr() | | | substring() | | | toLocaleLowerCase() | | | toLocaleUpperCase() | | | toLowerCase() | szöveg kisbetűssé | | toUpperCase() | szöveg nagybetűssé | | trim() | A white space karakter törlése a szöveg elejéről és végéről | | trimLeft() | | | trimRight() | | ===== Függvények ===== ==== Szintaxis ==== function név(paraméter: típus, ...): visszatérés_típusa { //tennivalók } ==== Nevesített függvény ==== Egy egyszerű függvény, ami nem ad vissza értéket és nincs bemenő paramétere így is leírható: function nevjegy() { console.log('Nagy János'); } nevjegy(); De megadhatjuk, hogy nincs visszatérési értéke: function nevjegy():void { console.log('Nagy János'); } nevjegy(); ==== Paraméterek ==== Vegyünk egy add() nevű függvényt, aminek két szám paramétere van: function add(szam1: number, szam2: number):number { return szam1 + szam2; } ==== Névtelen függvény ==== let udvozles = function() { console.log('Szia'); } udvozles(); let osszegzes = function(szam1: number, szam2: number):number { return szam1 + szam2; } console.log(osszegzes(30, 35)); ==== Opcionális paraméter ==== Ha egy változó neve után ? (kérdőjel) teszünk, az a változó nem kötelező. Az alábbi függvénynek kötelező megadni nevet, de a várost nem. function showData(name: string, city?: string) { console.log(name); if (city !== undefined) { console.log(city); } } showData('Nagy János'); showData('Nagy János', 'Szolnok'); let add = function (a: number, b: number, c?: number): number { if (c !== undefined) { return a + b + c; } return a + b; }; let result = add(30, 35); console.log(result); A szelekciót így is írhatjuk: if (typeof c !== 'undefined') { } Ha a **typeof** operátort használjuk az undefined szót a idézőjelbe, aposztrófok vagy ferde aposztrófok közzé kell tenni. 'undefined' "undefined" `undefined` ==== Alapértelmezett paraméter ==== function showData(name: string, city: string = 'ismeretlen') { console.log(name + ' ' + city); } showData('Nagy János'); showData('Nagy János', 'Szolnok'); ==== Nyílfüggvény ==== let udvozles = () => { console.log('Szia'); } udvozles(); let osszegzes = (szam1: number, szam2: number):number => { return szam1 + szam2; } console.log(osszegzes(30, 35)); Ha csak egy utasítás van, a törzs rész egyszerűsíthető: let osszegzes = (szam1: number, szam2: number):number => szam1 + szam2; console.log(osszegzes(30, 35)); ==== Változó hosszúságú paraméterlista ==== A változó hosszúságú paramétereket a TypeScript **Rest** paraméternek nevezi. function kibarat(nev: string, ...baratok: string[]) { console.log(nev + ': '+ baratok.join(', ')); } kibarat('János', 'Béla'); kibarat('Emes', 'Timi', 'Gabi', 'Pali'); ===== Függelék ===== ==== Űrlap tartalma ==== const input1 = document.getElementById("szam1")! as HTMLInputElement; ==== Példa ====

Összeadó

const mehetGomb = document.querySelector("#mehetGomb"); const input1 = document.getElementById("szam1")! as HTMLInputElement; const input2 = document.getElementById("szam2")! as HTMLInputElement; function add(szam1: number, szam2: number) { return szam1 + szam2; } mehetGomb.addEventListener("click", function() { console.log(add(+input1.value, +input2.value)); }); A generált kód: var mehetGomb = document.querySelector("#mehetGomb"); var input1 = document.getElementById("szam1"); var input2 = document.getElementById("szam2"); function add(szam1, szam2) { return szam1 + szam2; } mehetGomb.addEventListener("click", function () { console.log(add(+input1.value, +input2.value)); }); ==== A tsc paraméter ==== Windows alatt csak Git Bashben működik (ha az telepítve van): tsc src/*.ts Megoldáshoz nézzük meg: [[oktatas:web:typescript:typescript_tsconfig_beallitofajl#forras_es_celmegadas|Forrás és célmegadás]] ===== Források ===== * https://www.typescriptlang.org/docs/ (2021) * https://www.typescriptlang.org/docs/handbook/compiler-options.html (2021) * https://www.tutorialspoint.com/typescript/index.htm (2021) * https://www.typescripttutorial.net/ (2021) * https://code.visualstudio.com/docs/typescript/typescript-tutorial (2021) * https://www.tutorialsteacher.com/typescript (2021) * https://www.javatpoint.com/typescript-types (2021) * https://www.educative.io/blog/typescript-tutorial (2021) * https://www.tutorialsteacher.com/typescript (2021)