Distribuoituvat ehdolliset tyypit
Hallinnoikaa sitä, miten ehdolliset tyypit jakautuvat unionien yli.
Distribuoituvat ehdolliset tyypit on ilmainen TypeScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/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.
Yllättävä toimintatapa
Ehdollisilla tyypeillä on yksi erityissääntö: kun tarkistettava tyyppi on paljas tyyppiparametri ja annat unionin, ehdollinen tyyppi jakautuu kunkin jäsenen käsittelyyn erikseen ja yhdistää sitten tulokset unioniksi.
Tämä on Exclude-, Extract- ja monien muiden apuohjelmien perusta.
type ToArray<T> = T extends unknown ? T[] : never;
type A = ToArray<string | number>;
// string[] | number[] (NOT (string | number)[])Mitä ”paljas” tarkoittaa
”Paljas” tarkoittaa, että tyyppiparametri esiintyy sellaisenaan extends-lausekkeen vasemmalla puolella eikä ole kääritty toiseen tyyppiin. Jakautuminen tapahtuu vain paljailla parametreilla.
type Naked<T> = T extends string ? "y" : "n";
// T is naked -> distributes over unionsJakautuminen vaihe vaiheelta
Tyypin ToArray<string | number> tapauksessa kääntäjä käsittelee jokaisen jäsenen erikseen:
ToArray<string>= string[]ToArray<number>= number[]
Sitten se yhdistää ne unioniksi: string[] | number[].
type R = ToArray<boolean>;
// boolean is true | false, so:
// true[] | false[]Unionin suodattaminen
Jakautuminen tekee suodattamisesta helppoa. Muuta ei-toivotut jäsenet tyypiksi never; never katoaa unionista, jolloin jäljelle jäävät vain säilytettävät jäsenet.
type Strings<T> = T extends string ? T : never;
type A = Strings<string | number | boolean>; // stringnever katoaa unioneista
Keskeinen tieto: X | never yksinkertaistuu muotoon X. Kun jakautuvan haaran tulos on never, kyseinen jäsen poistuu käytännössä lopullisesta unionista.
type A = string | never; // string
type B = "a" | never | "b"; // "a" | "b"Jakautumisen poistaminen käytöstä
Joskus et halua jakautumista, esimerkiksi kun vertaat koko unionia yhtenä kokonaisuutena. Kääri molemmat puolet yksialkioiseen tupleen: [T] extends [U]. Nyt T ei enää ole paljas, joten jakautuminen on poistettu käytöstä.
type IsNever<T> = [T] extends [never] ? true : false;
type A = IsNever<never>; // true
type B = IsNever<string>; // falseMiksi kääriminen toimii
Sijoittamalla [T] vasemmalle tarkistettava tyyppi on tuple eikä paljas parametri. Erityissääntö jakautumisesta ei enää päde, joten unioni tarkistetaan kokonaisuutena.
type AllStrings<T> = [T] extends [string] ? true : false;
type A = AllStrings<"a" | "b">; // true
type B = AllStrings<"a" | number>; // falseJakautuva ja jakautumaton muoto
Verrataan näitä kahta muotoa suoraan. Paljas versio tarkistaa jokaisen jäsenen, kun taas kääritty versio tarkistaa unionin yhtenä tyyppinä.
type Distributed<T> = T extends string ? true : false;
type Wrapped<T> = [T] extends [string] ? true : false;
type A = Distributed<string | number>; // boolean (true | false)
type B = Wrapped<string | number>; // falseExclude-tyypin sisäinen toiminta
Sisäänrakennettu Exclude<T, U> poistaa tyypistä T kaikki jäsenet, jotka ovat sijoitettavissa tyyppiin U. Se on vain distributiivinen ehdollinen tyyppi, joka muuttaa täsmäävät jäsenet tyypiksi never.
type MyExclude<T, U> = T extends U ? never : T;
type A = MyExclude<"a" | "b" | "c", "b">; // "a" | "c"Extract-tyypin sisäinen toiminta
Extract<T, U> toimii päinvastoin: se säilyttää vain jäsenet, jotka ovat sijoitettavissa tyyppiin U. Jakautuminen on sama, mutta haarat ovat päinvastaiset.
type MyExtract<T, U> = T extends U ? T : never;
type A = MyExtract<"a" | "b" | "c", "a" | "c">; // "a" | "c"Käytännön teho
Jakautumisen avulla voit muuntaa unionin jokaisen jäsenen yhdellä lausekkeella: muodostaa jokaisesta jäsenestä taulukon, lisätä etuliitteen jokaiseen merkkijonoon tai suodattaa rakenteen perusteella. Kun käytät koko unionin tarkistamiseen muotoa [T] extends [U], voit hallita tarkasti, milloin jakautuminen tapahtuu.
Merkintä: Oikeassa TypeScriptissä template literal -tyypit kirjoitetaan backtick-merkkien rajaamina merkkijonoina, jotka sisältävät dollarimerkki-aaltosulkeilla merkittyjä paikkoja. Näissä esimerkeissä esitämme kyseisen hahmon muodossa Tpl<...> ja luettelemme osat järjestyksessä; esimerkiksi backtick-kuvio, joka täsmää ensin literaaliseen etuliitteeseen ja sitten Rest-arvoon, esitetään muodossa Tpl<'prefix', infer Rest>.
type Prefix<T extends string> = T extends unknown ? Tpl<'id_', T> : never;
// Tpl<'id_', T> is the template literal type joining 'id_' with each T
type A = Prefix<'a' | 'b'>; // 'id_a' | 'id_b'Pikatarkistus
Testaa, miten hyvin ymmärrät distributiiviset ehdolliset tyypit.
Kertaus
Distributiiviset ehdolliset tyypit ovat unionien apuohjelmien moottori.
- Paljas
T extends U ?jakautuu jokaisen unionin jäsenen käsittelyyn. never-arvon palauttavat haarat suodattavat jäsenet pois.[T] extends [U]poistaa jakautumisen käytöstä koko unionin tarkistamista varten.ExcludejaExtractovat pieniä distributiivisia ehdollisia tyyppejä.
Seuraavaksi kurssilla 22: aritmetiikka tyyppijärjestelmässä.
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 ”Distribuoituvat ehdolliset tyypit” ilmainen?
Kyllä – oppitunnin ”Distribuoituvat ehdolliset tyypit” 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 ”Distribuoituvat ehdolliset tyypit”?
Hallinnoikaa sitä, miten ehdolliset tyypit jakautuvat unionien yli. 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 4/4.
Kuinka kauan ”Distribuoituvat ehdolliset tyypit”-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
- Tyypit laskentakielenä
- Tason tyyppiehtolausekkeet
- Tason tyyppirekursio
- Distribuoituvat ehdolliset tyypit