Eesti

Uurige TypeScript'i mall-literaaltüüpe ja kuidas neid saab kasutada väga tüübikindlate ja hooldatavate API-de loomiseks, parandades koodi kvaliteeti ja arendajakogemust.

TypeScript'i mall-literaaltüübid tüübikindlate API-de jaoks

TypeScript'i mall-literaaltüübid on võimas funktsioon, mis lisati TypeScript 4.1-s ja mis võimaldab teil teostada stringidega manipuleerimist tüübitasandil. Need avavad maailma võimalusi väga tüübikindlate ja hooldatavate API-de loomiseks, võimaldades teil püüda vigu kompileerimisajal, mis muidu ilmniksid alles käivitusajal. See omakorda viib parema arendajakogemuse, lihtsama refaktoriseerimise ja robustsema koodini.

Mis on mall-literaaltüübid?

Oma olemuselt on mall-literaaltüübid string-literaaltüübid, mida saab konstrueerida, kombineerides string-literaaltüüpe, unioonitüüpe ja tüübimuutujaid. Mõelge neist kui stringide interpoleerimisest tüüpide jaoks. See võimaldab teil luua uusi tüüpe olemasolevate põhjal, pakkudes suurt paindlikkust ja väljendusrikkust.

Siin on lihtne näide:

type Greeting = "Tere, maailm!";

type PersonalizedGreeting<T extends string> = `Tere, ${T}!`;

type MyGreeting = PersonalizedGreeting<"Alice">; // tüüp MyGreeting = "Tere, Alice!"

Selles näites on PersonalizedGreeting mall-literaaltüüp, mis võtab geneerilise tüübiparameetri T, mis peab olema string. Seejärel konstrueerib see uue tüübi, interpoleerides string-literaali "Tere, " T väärtusega ja string-literaaliga "!". Tulemuseks olev tüüp, MyGreeting, on "Tere, Alice!".

Mall-literaaltüüpide kasutamise eelised

Reaalse maailma kasutusjuhud

1. API lõpp-punktide defineerimine

Mall-literaaltüüpe saab kasutada API lõpp-punktide tüüpide defineerimiseks, tagades, et API-le edastatakse õiged parameetrid ja et vastust käsitletakse korrektselt. Kujutage ette e-kaubanduse platvormi, mis toetab mitut valuutat, nagu USD, EUR ja JPY.

type Currency = "USD" | "EUR" | "JPY";
type ProductID = string; //Praktikas võiks see olla spetsiifilisem tüüp

type GetProductEndpoint<C extends Currency> = `/products/${ProductID}/${C}`;

type USDEndpoint = GetProductEndpoint<"USD">; // tüüp USDEndpoint = "/products/${string}/USD"

See näide defineerib GetProductEndpoint tüübi, mis võtab valuuta tüübiparameetrina. Tulemuseks olev tüüp on string-literaaltüüp, mis esindab API lõpp-punkti toote hankimiseks määratud valuutas. Seda lähenemist kasutades saate tagada, et API lõpp-punkt on alati korrektselt konstrueeritud ja et kasutatakse õiget valuutat.

2. Andmete valideerimine

Mall-literaaltüüpe saab kasutada andmete valideerimiseks kompileerimisajal. Näiteks võiksite neid kasutada telefoninumbri või e-posti aadressi vormingu valideerimiseks. Kujutage ette, et peate valideerima rahvusvahelisi telefoninumbreid, millel võivad olla erinevad vormingud vastavalt riigikoodile.

type CountryCode = "+1" | "+44" | "+81"; // USA, ÜK, Jaapan
type PhoneNumber<C extends CountryCode, N extends string> = `${C}-${N}`;

type ValidUSPhoneNumber = PhoneNumber<"+1", "555-123-4567">; // tüüp ValidUSPhoneNumber = "+1-555-123-4567"

//Märkus: Keerulisem valideerimine võib nõuda mall-literaaltüüpide kombineerimist tingimustüüpidega.

See näide näitab, kuidas saaksite luua põhilise telefoninumbri tüübi, mis jõustab kindla vormingu. Keerulisem valideerimine võib hõlmata tingimustüüpide ja regulaaravaldistele sarnaste mustrite kasutamist mall-literaalis.

3. Koodi genereerimine

Mall-literaaltüüpe saab kasutada koodi genereerimiseks kompileerimisajal. Näiteks võiksite neid kasutada Reacti komponentide nimede genereerimiseks vastavalt andmete nimele, mida nad kuvavad. Levinud muster on komponentide nimede genereerimine järgides `<Entity>Details` mustrit.

type Entity = "User" | "Product" | "Order";
type ComponentName<E extends Entity> = `${E}Details`;

type UserDetailsComponent = ComponentName<"User">; // tüüp UserDetailsComponent = "UserDetails"

See võimaldab teil automaatselt genereerida komponendinimesid, mis on järjepidevad ja kirjeldavad, vähendades nimede konfliktide riski ja parandades koodi loetavust.

4. Sündmuste käsitlemine

Mall-literaaltüübid on suurepärased sündmuste nimede tüübikindlaks defineerimiseks, tagades, et sündmuste kuulajad on korrektselt registreeritud ja et sündmuste käsitlejad saavad oodatud andmeid. Kujutage ette süsteemi, kus sündmused on kategoriseeritud mooduli ja sündmuse tüübi järgi, eraldatud kooloniga.

type Module = "user" | "product" | "order";
type EventType = "created" | "updated" | "deleted";
type EventName<M extends Module, E extends EventType> = `${M}:${E}`;

type UserCreatedEvent = EventName<"user", "created">; // tüüp UserCreatedEvent = "user:created"

interface EventMap {
  [key: EventName<Module, EventType>]: (data: any) => void; //Näide: Sündmuste käsitlemise tüüp
}

See näide demonstreerib, kuidas luua sündmuste nimesid, mis järgivad järjepidevat mustrit, parandades sündmuste süsteemi üldist struktuuri ja tüübikindlust.

Täiustatud tehnikad

1. Kombineerimine tingimustüüpidega

Mall-literaaltüüpe saab kombineerida tingimustüüpidega, et luua veelgi keerukamaid tüübimuutusi. Tingimustüübid võimaldavad teil defineerida tüüpe, mis sõltuvad teistest tüüpidest, võimaldades teil teostada keerulist loogikat tüübitasandil.

type ToUpperCase<S extends string> = S extends Uppercase<S> ? S : Uppercase<S>;

type MaybeUpperCase<S extends string, Upper extends boolean> = Upper extends true ? ToUpperCase<S> : S;

type Example = MaybeUpperCase<"tere", true>; // tüüp Example = "TERE"
type Example2 = MaybeUpperCase<"maailm", false>; // tüüp Example2 = "maailm"

Selles näites võtab MaybeUpperCase stringi ja boolean-väärtuse. Kui boolean on tõene, teisendab see stringi suurtähtedeks; vastasel juhul tagastab see stringi sellisena, nagu see on. See demonstreerib, kuidas saate stringitüüpe tingimuslikult muuta.

2. Kasutamine kaardistatud tüüpidega

Mall-literaaltüüpe saab kasutada koos kaardistatud tüüpidega, et muuta objektitüübi võtmeid. Kaardistatud tüübid võimaldavad teil luua uusi tüüpe, itereerides üle olemasoleva tüübi võtmete ja rakendades igale võtmele teisendust. Levinud kasutusjuht on ees- või järelliite lisamine objekti võtmetele.

type MyObject = {
  name: string;
  age: number;
};

type AddPrefix<T, Prefix extends string> = {
  [K in keyof T as `${Prefix}${string & K}`]: T[K];
};

type PrefixedObject = AddPrefix<MyObject, "data_">;
// tüüp PrefixedObject = {
//    data_name: string;
//    data_age: number;
// }

Siin võtab AddPrefix objektitüübi ja eesliite. Seejärel loob see uue objektitüübi samade omadustega, kuid igale võtmele on lisatud eesliide. See võib olla kasulik andmeedastusobjektide (DTO-de) või muude tüüpide genereerimiseks, kus peate omaduste nimesid muutma.

3. Sisseehitatud stringidega manipuleerimise tüübid

TypeScript pakub mitmeid sisseehitatud stringidega manipuleerimise tüüpe, nagu Uppercase, Lowercase, Capitalize ja Uncapitalize, mida saab kasutada koos mall-literaaltüüpidega keerukamate stringiteisenduste teostamiseks.

type MyString = "tere maailm";

type CapitalizedString = Capitalize<MyString>; // tüüp CapitalizedString = "Tere maailm"

type UpperCasedString = Uppercase<MyString>;   // tüüp UpperCasedString = "TERE MAAILM"

Need sisseehitatud tüübid muudavad tavaliste stringidega manipuleerimiste teostamise lihtsamaks, ilma et peaksite kirjutama kohandatud tüübiloogikat.

Parimad praktikad

Levinud lõksud

Alternatiivid

Kuigi mall-literaaltüübid pakuvad võimsat viisi tüübikindluse saavutamiseks API arenduses, on olemas alternatiivseid lähenemisviise, mis võivad teatud olukordades olla sobivamad.

Kokkuvõte

TypeScript'i mall-literaaltüübid on väärtuslik tööriist tüübikindlate ja hooldatavate API-de loomiseks. Need võimaldavad teil teostada stringidega manipuleerimist tüübitasandil, võimaldades teil püüda vigu kompileerimisajal ja parandada oma koodi üldist kvaliteeti. Mõistes selles artiklis käsitletud kontseptsioone ja tehnikaid, saate kasutada mall-literaaltüüpe, et ehitada robustsemaid, usaldusväärsemaid ja arendajasõbralikumaid API-sid. Olenemata sellest, kas ehitate keerulist veebirakendust või lihtsat käsurea tööriista, võivad mall-literaaltüübid aidata teil kirjutada paremat TypeScripti koodi.

Kaaluge edasiste näidete uurimist ja mall-literaaltüüpidega katsetamist oma projektides, et täielikult mõista nende potentsiaali. Mida rohkem te neid kasutate, seda mugavamaks muutute nende süntaksi ja võimalustega, mis võimaldab teil luua tõeliselt tüübikindlaid ja robustseid rakendusi.