TypeScript Academy · Oppitunti

Discriminated union -tyypit turvalliseen pattern matching -käsittelyyn

Lisätkää unionin jäsenille yhteinen literaalikenttä tyyppiturvallisuuden varmistamiseksi

Oppitunti 3/413 vaihetta

Discriminated union -tyypit turvalliseen pattern matching -käsittelyyn on ilmainen TypeScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Tervetuloa

Diskriminoidut unionit lisäävät unionin jäsenille yhteisen literaaliominaisuuden. TypeScript käyttää tätä diskriminanttia tyypin tarkentamiseen switch- ja if-lauseissa.

Diskriminanttiominaisuus

Diskriminantti on ominaisuus, jolla on kussakin unionin jäsenessä yksilöllinen literaalityyppi. TypeScript tarkentaa unionia sen arvon perusteella.
type Circle = { kind: 'circle'; radius: number };
type Square = { kind: 'square'; side: number };
type Shape = Circle | Square;

Tyypin tarkentaminen if-tarkistuksilla

Tarkistakaa diskriminantti if-lauseessa. TypeScript tarkentaa tyypin vastaavaksi unionin jäseneksi.
function area(shape: Shape): number {
  if (shape.kind === 'circle') {
    return Math.PI * shape.radius ** 2;
  }
  return shape.side ** 2; // narrowed to Square
}

Tyypin tarkentaminen switch/case-rakenteella

switch-lauseet toimivat erinomaisesti diskriminoitujen unionien kanssa. Kukin case tarkentaa tyypin tiettyyn jäseneen.
function describe(shape: Shape): string {
  switch (shape.kind) {
    case 'circle': return `Circle r=${shape.radius}`;
    case 'square': return `Square s=${shape.side}`;
  }
}

Kattavuuden tarkistaminen never-tyypillä

Lisätkää oletustapaus, joka sijoitetaan tyyppiin `never`. Jos lisäätte uuden unionin jäsenen mutta unohdatte käsitellä sen, TypeScript ilmoittaa virheestä.
function area(shape: Shape): number {
  switch (shape.kind) {
    case 'circle': return Math.PI * shape.radius ** 2;
    case 'square': return shape.side ** 2;
    default:
      const _exhaustive: never = shape;
      throw new Error('Unhandled shape');
  }
}

Result-tyyppikuvio

Diskriminoidut unionit sopivat erinomaisesti Result-kuvioon: sen avulla palautetaan joko onnistumistiedot tai virhe ilman poikkeuksen heittämistä.
type Ok<T> = { ok: true; value: T };
type Err = { ok: false; error: string };
type Result<T> = Ok<T> | Err;

Toimintotyyppikuvio (Redux-tyylinen)

Reduxissa ja vastaavissa järjestelmissä toiminnot ovat diskriminoituja unioneja. `type`-kenttä toimii diskriminanttina.
type Action =
  | { type: 'INCREMENT'; amount: number }
  | { type: 'DECREMENT'; amount: number }
  | { type: 'RESET' };

Useita diskriminanttiominaisuuksia

Diskriminantin ei tarvitse olla yksi ominaisuus — TypeScript voi tarkentaa tyypin minkä tahansa tarkistusten yhdistelmän perusteella.
type AdminUser = { role: 'admin'; permissions: string[] };
type RegularUser = { role: 'user'; credits: number };
type User = AdminUser | RegularUser;

Myös diskriminoimattomat unionit tarkentuvat

Myös ilman diskriminanttia TypeScript tarkentaa unioneja typeof-, instanceof- ja ominaisuustarkistuksilla.
type StringOrArr = string | string[];
function flatten(val: StringOrArr): string[] {
  return Array.isArray(val) ? val : [val];
}

Diskriminoidut unionit ja luokkahierarkiat

Diskriminoidut unionit ovat toiminnallinen vaihtoehto luokkaperinnälle muunnelmien mallintamisessa. Ne ovat yksinkertaisempia, sarjoitettavia ja toimivat hyvin pattern matching -rakenteiden kanssa.

Käytännön esimerkki: HTTP-vastausunionit

Mallintakaa API-vastauksen eri tilat diskriminoituna unionina.
type ApiState<T> =
  | { status: 'loading' }
  | { status: 'success'; data: T }
  | { status: 'error'; message: string };

Pikakertaus

Mitä jokaisella diskriminoidun unionin jäsenellä täytyy olla, jotta TypeScript voi tarkentaa tyypin oikein?

Kertaus

Diskriminoidut unionit käyttävät yhteistä literaaliominaisuutta diskriminanttina. Tarkentakaa tyyppi switch/case-rakenteella ja lisätkää never-kattavuustarkistus käsittelemättömien tapausten havaitsemiseksi. Ne sopivat erityisen hyvin tilakoneisiin, toimintoihin ja API-vastauksiin.
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 ”Discriminated union -tyypit turvalliseen pattern matching -käsittelyyn” ilmainen?

Kyllä – oppitunnin ”Discriminated union -tyypit turvalliseen pattern matching -käsittelyyn” 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 ”Discriminated union -tyypit turvalliseen pattern matching -käsittelyyn”?

Lisätkää unionin jäsenille yhteinen literaalikenttä tyyppiturvallisuuden varmistamiseksi 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 3/4.

Kuinka kauan ”Discriminated union -tyypit turvalliseen pattern matching -käsittelyyn”-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. Union-tyypit: A tai B
  2. Intersection-tyypit: A ja B
  3. Discriminated union -tyypit turvalliseen pattern matching -käsittelyyn
  4. Union- ja intersection-tyyppien käytännön mallit
← Takaisin: TypeScript Academy