TypeScript Academy · Oppitunti

Distribuoituvat ehdolliset tyypit

Hallinnoikaa sitä, miten ehdolliset tyypit jakautuvat unionien yli.

Oppitunti 4/413 vaihetta

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 unions

Jakautuminen 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>; // string

never 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>; // false

Miksi 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>;  // false

Jakautuva 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>;     // false

Exclude-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.
  • Exclude ja Extract ovat pieniä distributiivisia ehdollisia tyyppejä.

Seuraavaksi kurssilla 22: aritmetiikka tyyppijärjestelmässä.

Aloita maksutta

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

  1. Tyypit laskentakielenä
  2. Tason tyyppiehtolausekkeet
  3. Tason tyyppirekursio
  4. Distribuoituvat ehdolliset tyypit
← Takaisin: TypeScript Academy