Tyypitetyt sujuvat rajapinnat
Ketjuttakaa metodeja ja seuratkaa kertyvää tilaa tyypeissä.
Tyypitetyt sujuvat rajapinnat on ilmainen TypeScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu TypeScript Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. TypeScript Academy-kurssilla on yhteensä 4 oppituntia.
Asetettujen arvojen seuranta
Yksinkertainen rakentaja sallii build()-kutsun milloin tahansa, vaikka pakollisia kenttiä puuttuisi. Voimme parantaa tätä seuraamalla kertynyttä tilaa tyyppijärjestelmässä geneerisen tyyppiparametrin avulla.
Tilaa kuvaava tyyppiparametri
Annamme rakentajalle geneerisen S-tyypin, joka kirjaa, mitkä avaimet on tähän mennessä annettu. Jokaisen metodin suorituksen jälkeen laajennamme S-tyyppiä sisältämään uuden avaimen.
class Builder<S> {
// S is a record of keys set so far, e.g. {} or { url: string }
private data: Record<string, unknown> = {};
}Jokainen metodi lisää avaimen
Setter-metodi palauttaa uuden tyypitetyn rakentajan, jonka S-tyyppi sisältää juuri lisätyn avaimen. Suorituksen aikana arvo tallennetaan, ja tyyppi laajenee vastaavasti.
set<K extends string, V>(key: K, value: V): Builder<S & Record<K, V>> {
this.data[key] = value;
return this as unknown as Builder<S & Record<K, V>>;
}Leikkaustekniikka
Lauseke S & Record<K, V> muodostaa edellisen tilan ja uuden avaimen leikkauksen. Kahden kutsun jälkeen tyyppi tuntee tarkasti molemmat avaimet.
type Empty = {};
type AfterUrl = Empty & Record<"url", string>;
type AfterBoth = AfterUrl & Record<"method", string>;
// AfterBoth = { url: string; method: string }Konkreettinen sujuva rakentaja
Tässä pyyntörakentaja kuljettaa kertynyttä rakennetta mukana jokaisessa kutsussa. Kääntäjä tietää aina tarkasti, mitkä kentät ovat olemassa.
class Req<S> {
private d: Record<string, unknown> = {};
url(u: string): Req<S & { url: string }> {
this.d.url = u; return this as any;
}
method(m: string): Req<S & { method: string }> {
this.d.method = m; return this as any;
}
}Tyyppi laajenee ketjutettaessa
Jokainen ketjun kutsu tuottaa täsmällisemmän rakentajatyypin. Kun viette osoittimen editorissa tuloksen päälle, näette kertyneen tilan.
const partial = new Req<{}>().url("/x");
// type: Req<{ url: string }>
const full = partial.method("POST");
// type: Req<{ url: string; method: string }>Miksi tilaa kannattaa seurata?
Kun tyyppi sisältää annetut avaimet, voimme myöhemmin rajoittaa build()-metodin kääntymään vain silloin, kun pakolliset avaimet ovat mukana. Tilaparametri luo perustan tälle takaukselle.
Kertyneen rakenteen tarkasteleminen
Voitte erottaa kertyneen rakenteen ja tarkastella sitä. Näin voitte varmistaa, että rakentajan tyyppi vastaa täsmälleen määritettyä sisältöä.
type StateOf<T> = T extends Req<infer S> ? S : never;
type S1 = StateOf<Req<{ url: string }>>; // { url: string }Ajonaikainen toteutus pysyy yksinkertaisena
Kaikki nerokkuus on tyypeissä. Suorituksen aikana jokainen setter-metodi vain tallentaa arvon olioon. Muunnokset (as any) yhdistävät ajonaikaisen olion rikkaampaan käännösaikaiseen tyyppiin.
const r = new Req<{}>().url("/users").method("GET");
console.log("configured url and method");Geneerinen tila tilikirjana
Ajatelkaa S-tyyppiä tilikirjana siitä, mitä on asetettu. Metodit lisäävät siihen merkintöjä, ja build-vaihe voi myöhemmin lukea tilikirjaa päättääkseen, sallitaanko muodostaminen.
Kompromissit
Tilan seuraaminen tyyppitasolla antaa täsmällistä palautetta IDE:ssä ja estää puutteelliset muodostamiset, mutta vaatii muutaman muunnoksen ja kehittyneempiä geneerisiä tyyppejä. Se kannattaa, kun monet käyttäjät hyödyntävät rajapintaa.
Pikatarkistus
Tässä oppitunnin pikatarkistus.
Kertaus
Sujuva tyypitetty rakentaja sisältää geneerisen tilaparametrin S. Jokainen setter-metodi muodostaa leikkauksen S-tyypin ja uuden avaimen välille (S & Record<K, V>) ja palauttaa täsmällisemmän rakentajan, jolloin kääntäjällä on tarkka tilikirja määritetyistä kentistä.
Opi TypeScript tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 101
- Oppitunnit
- 352
Usein kysytyt kysymykset
Onko oppitunti ”Tyypitetyt sujuvat rajapinnat” ilmainen?
Kyllä – oppitunnin ”Tyypitetyt sujuvat rajapinnat” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko TypeScript Academy-kurssin, päivitä CoddyKit PROhon. TypeScript Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Tyypitetyt sujuvat rajapinnat”?
Ketjuttakaa metodeja ja seuratkaa kertyvää tilaa tyypeissä. Harjoittelet TypeScript Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni TypeScript Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin TypeScript Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Tyypitetyt sujuvat rajapinnat”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä TypeScript Academy-oppitunnilla?
Kyllä. Jokainen TypeScript Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Builder-mallin perusteet
- Tyypitetyt sujuvat rajapinnat
- Pakollisten vaiheiden varmistaminen
- Muuttumattomat builderit