TypeScript Academy · Oppitunti

Result-tyyppien mallintaminen

Esittäkää onnistuminen ja epäonnistuminen datana Result-tyypin avulla.

Oppitunti 2/413 vaihetta

Result-tyyppien mallintaminen 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.

Result-tyyppi

Result kuvaa operaatiota, joka joko onnistuu palauttaen arvon tai epäonnistuu palauttaen virheen. Se on diskriminoitu unioni, jonka voi palauttaa poikkeuksen heittämisen sijaan.

Result-tyypin määrittäminen

Klassisessa rakenteessa käytetään ok-diskriminanttia. Kun ok on tosi, mukana on value; kun se on epätosi, mukana on error.

type Result<T, E> =
  | { ok: true; value: T }
  | { ok: false; error: E };

Rakentaja-apufunktiot

Pienet ok- ja err-apufunktiot tekevät tulosten rakentamisesta tiivistä ja helposti luettavaa sen sijaan, että objektilitteraalit kirjoitettaisiin joka kerta käsin.

const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });
const err = <E>(error: E): Result<never, E> => ({ ok: false, error });

Result-arvon palauttaminen

Virhealtis funktio palauttaa joko ok(value)- tai err(error)-arvon. Paluutyyppi ilmoittaa molemmista mahdollisuuksista jokaiselle kutsujalle.

function divide(a: number, b: number): Result<number, string> {
  return b === 0 ? err("divide by zero") : ok(a / b);
}

Tyypin tarkentaminen ok-arvon perusteella

result.ok-arvon tarkistaminen tarkentaa unionityyppiä. Tosihaarassa TypeScript tietää, että value on olemassa; epätosihaarassa se tietää, että error on olemassa.

const r = divide(10, 2);
if (r.ok) console.log(r.value); // 5
else console.log(r.error);

Diskriminantti ohjaa turvallisuutta

ok-kenttä on diskriminantti, jonka avulla kääntäjä voi valita oikean haaran. Ette voi käyttää value-arvoa todistamatta ensin, että ok on tosi.

const r = divide(1, 0);
// r.value here is a type error until we check r.ok
if (!r.ok) console.log("err:", r.error);

Tyypitetyt virheet

Virheet voivat olla muutakin kuin merkkijonoja. Tyypitetyn virheunionin avulla kutsujat voivat käsitellä kutakin virhetyyppiä täsmällisesti tyypin tarkentamisen jälkeen.

type DivErr = { kind: "zero" } | { kind: "overflow" };
function div(a: number, b: number): Result<number, DivErr> {
  if (b === 0) return err({ kind: "zero" });
  return ok(a / b);
}

Kattava virheenkäsittely

Koska virhetyyppi on unioni, sen diskriminanttiin perustuvan switch-lauseen kattavuus voidaan tarkistaa. Näin varmistetaan, että jokainen epäonnistumistapa käsitellään.

const r = div(1, 0);
if (!r.ok) {
  switch (r.error.kind) {
    case "zero": console.log("no zero"); break;
    case "overflow": console.log("too big"); break;
  }
}

Oletusarvon palauttava apufunktio

Joskus haluatte vain arvon tai varavaihtoehdon. Pieni unwrapOr on selkeä ja pitää epäonnistumisen käsittelyn paikallisena.

function unwrapOr<T, E>(r: Result<T, E>, fallback: T): T {
  return r.ok ? r.value : fallback;
}
console.log(unwrapOr(divide(1, 0), -1)); // -1

Result verrattuna poikkeuksen heittämiseen

Result siirtää epäonnistumisen paluutyyppiin, joten kutsujien on käsiteltävä se. Haittapuolena on eksplisiittisempi koodi, mikä on yleensä kannattava hinta odotetuista virheistä.

Täydellinen esimerkki

Kootaan kaikki yhteen: määritelkää apufunktiot, palauttakaa Result-arvoja ja tarkentakaa tyyppi ennen käyttöä. Kääntäjä varmistaa, että virhehaara huomioidaan.

function safeParse(s: string): Result<number, string> {
  const n = Number(s);
  return Number.isNaN(n) ? err("NaN") : ok(n);
}
const p = safeParse("42");
console.log(p.ok ? p.value : p.error); // 42

Pikatarkistus

Tämän oppitunnin pikatarkistus.

Kertaus

Result<T, E> on diskriminoitu unioni, joka on joko { ok: true; value } tai { ok: false; error }. Rakentakaa se ok- ja err-apufunktioilla ja tarkentakaa tyyppi ok-arvon perusteella, jotta voitte käyttää value- tai error-arvoa turvallisesti. Tyypitetyt virheet mahdollistavat kattavan käsittelyn.

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 ”Result-tyyppien mallintaminen” ilmainen?

Kyllä – oppitunnin ”Result-tyyppien mallintaminen” 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 ”Result-tyyppien mallintaminen”?

Esittäkää onnistuminen ja epäonnistuminen datana Result-tyypin avulla. 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 ”Result-tyyppien mallintaminen”-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. Virheiden heittämisen ongelma
  2. Result-tyyppien mallintaminen
  3. Option- ja Maybe-tyypit
  4. Railway-oriented programming
← Takaisin: TypeScript Academy