A szoftverfejlesztés során mindig arra törekszünk, hogy újrafelhasználható komponenseket hozzunk létre, olyan architektúrákat, amelyek többféle helyzethez is alkalmazkodnak, és mindig keressük a módját annak, hogy logikánkat úgy automatizáljuk, hogy az még a számítógéppel szemben is megfelelően működjön. ismeretlen.

És bár ez bizonyos helyzetekben nem mindig egyszerű vagy akár megvalósítható, gondolkodásmódunk mindig úgy van beállítva, hogy megtalálja azokat a mintákat, amelyek reprodukálhatók, majd általános algoritmussá alakíthatók, amely képes megbirkózni vele. Az Generics koncepciója pedig egy másik példa erre a viselkedésre, de ezúttal a makró helyett a mikrora megyünk, és megpróbálunk kódszintű mintákat találni és megjeleníteni.

Hadd magyarázzam el…

Mik azok a generikumok?

A Generics koncepciója mulatságos, ha már képes rátekerni a fejét, úgyhogy hadd kezdjem a következőképpen:

Az általánosok a típusokhoz, a típusok a változókhoz

Más szóval, a Generics lehetőséget biztosít a típusok használatára anélkül, hogy meg kellene adnia egyet. Ez új szintű rugalmasságot biztosít a függvények, osztályok és még az interfész definíciói tekintetében is.

Ennek klasszikus példája, amellyel egy generikus hatalmat magyaráznak, az identitásfüggvény. Ez a függvény lényegében azt adja vissza, amit paraméterként adsz át, nincs benne semmi fantáziadús, de ha belegondolsz, hogyan tudsz ilyen függvényt definiálni egy tipizált nyelven?

A fenti függvény nagyszerűen működik számoknál, de mi a helyzet a karakterláncokkal? Vagy logikai értékek? Mi a helyzet az egyedi típusokkal? Ezek mind a TypeScripten belüli lehetőségek, ezért kézenfekvő választás a any típus használata:

Ez nagyjából működik, de most a függvénye valójában elveszítette a típus fogalmát, nem tudja semmire használni a tényleges típus információit. Lényegében most már írhat ilyesmit, és a fordító nem mond semmit, olyan lesz, mintha sima JavaScriptet használna (tehát mindenféle típusinformáció nélkül):

Mivel nem rendelkezünk típusinformációkkal, a fordító nem tud semmit ellenőrizni a függvényünkkel és a változónkkal kapcsolatban, így egy nem kívánt „undefined”-be futunk (ami ha ezt a példát egy valós forgatókönyvre extrapoláljuk az összetettebb logika valószínűleg a legrosszabb problémává válik).

Hogyan javítsuk ki ezt, és kerüljük el a any típus használatát?

Tipp: Ossza meg újrafelhasználható összetevőit a projektek között a Bit ("Github") használatával. A Bit egyszerűvé teszi bármely projekt független összetevőinek megosztását, dokumentálását és rendszerezését.

Használja a kód újrafelhasználásának maximalizálására, a független komponenseken való együttműködésre és a skálázható alkalmazások létrehozására.

A Bit támogatja a Node, TypeScript, React, Vue, Angular stb.

TypeScript Generics to the Rescue

Ahogy korábban próbáltammondani: a Generic olyan, mint egy változó a típusaink számára, ami azt jelenti, hogy definiálhatunk egy olyan változót, amely bármilyen típust képvisel, de ugyanakkor megőrzi a típusinformációkat. Ez az utolsó rész kulcsfontosságú, mert pontosan ez az, amit any nem csinált. Ezt szem előtt tartva most újradefiniálhatjuk identitásfüggvényünket a következőképpen:

Ne feledje, hogy a Generic nevéhez használt betű bármi lehet, tetszés szerint nevezheti el. Az egyetlen betű használata azonban szabványnak tűnik, így mindannyian ezzel megyünk.

Ez most lehetővé teszi számunkra, hogy ne csak egy általános függvényt definiáljunk, amely bármilyen típussal használható, hanem azt is, hogy a kapcsolódó változók helyes információkat tartalmaznak a kiválasztott típusról. Mint ez:

Két dologra érdemes figyelni a képpel kapcsolatban:

  1. A típust közvetlenül a függvény neve után adom meg (‹ és › között). Ebben az esetben, mivel a függvény aláírása elég egyszerű, e nélkül is meghívhattuk volna a függvényt, és a fordító az átadott paraméterből következtetett volna a típusra. Mindazonáltal, ha a number szót string-re változtatja, akkor a teljes példa már nem működik.
  2. Most nem tudjuk kinyomtatni a length tulajdonságot, mivel a számoknak nincs meg.

Ez az a viselkedés, amelyet egy gépelt nyelvtől elvárhat, és ezért szeretné használni az általános kifejezést az általánosviselkedés meghatározásakor.

Mit tehetek még a Generics-szel?

Az előző példa a Generics „Hello World”jeként ismert, minden cikkben megtalálja, de nagyszerű módja annak, hogy elmagyarázza a benne rejlő lehetőségeket. De vannak más érdekes dolgok is, amelyeket elérhetsz, természetesen mindig a típusbiztonságon belül, ne feledd, olyan dolgokat akarsz építeni, amelyeket több helyzetben újra fel lehet használni, és ugyanakkor próbálsz kitartani. olyan típusú információkra, amelyekre annyira törődünk.

Automatikus szerkezet-ellenőrzés

Ez a kedvenc dolgom a generikus gyógyszerekkel kapcsolatban. Fontolja meg a következő forgatókönyvet: van egy rögzített szerkezete (azaz egy objektum), és dinamikusan próbál hozzáférni az if tulajdonságához. Mindannyian csináltuk már, ilyesmi:

Használhattam volna a hasOwnProperty-et vagy valami hasonlót, de érti a lényeget, el kell végeznie egy alapvető szerkezeti ellenőrzést, hogy megbizonyosodjon arról, hogy szabályozza azt a használati esetet, amelyben az elérni kívánt tulajdonság nem tartozik az objektumhoz. Most helyezzük át a TypeScript típusbiztonsági területére, és nézzük meg, hogyan segíthet nekünk a Generics:

Most figyelje meg, hogyan használom a Generics jelölést: nemcsak egy általános K típust deklarálok, hanem azt is mondom, hogy kibővíti a Személy kulcs típusát. Ez csodálatos! Deklaratívan kijelentheti, hogy olyan értéket fog átadni, amely megegyezik a name , age vagy city karakterláncokkal. Lényegében enumot hirdettél, ami ha jobban belegondolsz, kevésbé izgalmas, mint korábban. De nem kell itt megállnia, izgalmasabbá teheti ezt a funkciót a következőképpen definiálva:

Így van, most KÉT általános típusunk van, ezek közül az egyik az első kulcsait kiterjeszti, de lényegében már nem csak egy típusú objektumra (azaz Person -típusú objektumokra) és erre a függvényre korlátozódik. bármely tárgyával vagy szerkezetével használható, és tudja, hogy biztonságos lesz a használata.

És ez történik, ha érvénytelen tulajdonságnévvel használja:

Általános osztályok

Az általános kifejezések nem csak a függvényaláírásokra vonatkoznak, hanem saját általános osztályai meghatározására is használhatják őket. Ez érdekes viselkedést tesz lehetővé, és azt a képességet, hogy ezt az általános logikát újra felhasználható konstrukcióba foglalja.

Íme egy példa:

Ezzel a példával olyan felvezetőt definiálunk, amely bármilyen típusú állatot képes kezelni, de ezt megtehetjük a Generics nélkül is, az előny itt látható a példa utolsó két sorában. Ennek az az oka, hogy az általános kezelői logikával, amely teljesen egy általános osztályba van beépítve, könnyen korlátozhatjuk a típusokat, és típusspecifikus osztályokat hozhatunk létre, amelyek csak bármelyik állattípusnál működnek. Itt is hozzáadhat további viselkedést, és a típusadatok megmaradnak.

Ebből a példából egy másik kivonat az, hogy az általános típusok csak bizonyos csoportok kiterjesztésére kényszeríthetők. Amint a példában látható, a T csak hervadt Dog vagy Horse lehet, de semmi más.

Variadic Tuples

Ez valójában valami új, amit a TypeScript 4.0-s verziójában adtak hozzá. És bár "ebben a cikkben már foglalkoztam vele", gyorsan áttekintem itt.

Dióhéjban, amit a Variadic Tuples lehetővé tesz, az az, hogy a Generics segítségével meghatározza egy sor definíció változó részét, amely alapértelmezés szerint nem rendelkezik ilyenekkel.

Egy normál sordefiníció egy rögzített méretű tömböt adna előre meghatározott típusokkal minden eleméhez:

type MyTuple = [string, string, number]
let myList:MyTuple = ["Fernando", "Doglio", 37]

A Genericsnek és a Variadic Tuples-nek köszönhetően most valami ilyesmit tehet:

Ha észreveszi, egy Generic T-t használtunk (amely kiterjeszti a unknown tömböt), hogy egy változó szakaszt helyezzünk el a sor belsejében. Mivel a T egy unknown típusú lista, bármit beletehetsz. Esetleg meghatározhatja, hogy ez egy egyetlen típusú lista legyen, például:

A Sky a határ itt, lényegében megadhat egy sablont, amelyet később felhasználhat, és tetszés szerint kiterjesztheti (természetesen a sablonra beállított korlátozásokkal).

Következtetés

A Generics egy nagyon hatékony eszköz, és bár néha az ezeket használó kódok olvasása olyan érzés lehet, mintha hieroglifákat olvasnánk, először csak lassan kell haladni. Szánjon rá időt, elemezze gondolatban a kódot, és elkezdi látni a benne rejlő lehetőségeket.

Szóval mi van veled? Használt már Generics-t a múltban? Hagytam nagyobb hasznot a kilépésnek? Oszd meg kommentben másoknak is!

Találkozunk a következőben!

Tudj meg többet