TypeScript Academy · Pelajaran

Jenis gaya Result/Either

Modelkan kejayaan atau kegagalan secara jelas dengan kesatuan Result/Either, tambahkan pembantu (map/flatMap/mapError), dan kekalkan aliran yang boleh diramal tanpa try/catch di merata tempat.

Pelajaran 1 daripada 28 langkah

Jenis gaya Result/Either ialah pelajaran TypeScript Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 2. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran TypeScript Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus TypeScript Academy merangkumi sejumlah 2 pelajaran.

Pengenalan

Matlamat: Jadikan kegagalan kelihatan. Anda akan memodelkan hasil dengan kesatuan terbeza, menggabungkannya dengan pembantu, dan menukarkan pengecualian pada sempadan.

  • Jenis hasil
  • map/flatMap/mapError
  • Integrasi HTTP

Teras hasil

Cipta utiliti Hasil kecil: pembina ok/err serta map, flatMap, mapError untuk penggabungan.

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

export const ok = <T>(value: T): Ok<T> => ({ ok: true, value })
export const err = <E>(error: E): Err<E> => ({ ok: false, error })

export function map<T, E, U>(r: Result<T, E>, f: (t: T) => U): Result<U, E> {
  return r.ok ? ok(f(r.value)) : r
}
export function flatMap<T, E, U>(r: Result<T, E>, f: (t: T) => Result<U, E>): Result<U, E> {
  return r.ok ? f(r.value) : r
}
export function mapError<T, E, F>(r: Result<T, E>, g: (e: E) => F): Result<T, F> {
  return r.ok ? r : err(g(r.error))
}

Ralat domain

Modelkan ralat domain sebagai kesatuan terbeza dengan tag. Setiap cabang membawa data khusus untuk menghasilkan mesej yang baik.

export type CreateUserError =
  | { tag: "InvalidEmail"; detail?: string }
  | { tag: "Duplicate"; email: string }

export function validateEmail(email: string): Result<string, CreateUserError> {
  const okEmail = /.+@.+/.test(email)
  return okEmail ? ok(email.toLowerCase()) : err({ tag: "InvalidEmail", detail: "bad format" })
}

const existing = new Set(["ada@example.com"]) // pretend DB
export function saveUser(email: string): Result<{ id: string }, CreateUserError> {
  if (existing.has(email)) return err({ tag: "Duplicate", email })
  return ok({ id: Math.random().toString(36).slice(2) })
}

Menggabungkan aliran

Gabungkan pengesahan dengan flatMap. Gunakan pernyataan pilihan dengan pemeriksaan never untuk menguatkuasakan kesempurnaan semasa kompilasi.

export function createUser(flowEmail: string) {
  return flatMap(validateEmail(flowEmail), email => saveUser(email))
}

// Use
const r = createUser("Ada@example.com")
if (r.ok) {
  console.log("id:", r.value.id)
} else {
  switch (r.error.tag) {
    case "InvalidEmail": console.error("invalid email:", r.error.detail); break
    case "Duplicate": console.error("already used:", r.error.email); break
    default: ((x: never) => x)(r.error) // exhaustiveness
  }
}

Pengecualian kepada hasil

Pada sempadan input/output, bungkus pengecualian dan tukarkannya kepada Result. Pemanggil mengekalkan satu laluan ralat untuk dikendalikan.

export async function fromPromise<T>(p: Promise<T>): Promise<Result<T, { tag: "Exception"; message: string }>> {
  try { return ok(await p) }
  catch (e) { return err({ tag: "Exception", message: e instanceof Error ? e.message : String(e) }) }
}

// Example: wrap a fetch
export async function fetchJson<T>(url: string): Promise<Result<T, { tag: "Exception"; message: string }>> {
  return fromPromise(fetch(url).then(r => r.json() as T))
}

Petua pemetaan HTTP

Integrasi HTTP: petakan ralat domain kepada 400/409; pengecualian input/output kepada 502/503. Pastikan fungsi pemeta kecil supaya pengawal kekal kemas dan boleh dijangka.

Pemeriksaan manfaat hasil

Pemeriksaan pantas: Mengapakah kesatuan hasil terbeza lebih baik?

Ringkasan

Ringkasan: Takrifkan jenis Result kecil, gabungkan dengan map/flatMap, modelkan ralat domain sebagai kesatuan, dan tukarkan pengecualian pada sempadan.

Percuma untuk bermula

Pelajari TypeScript dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
101
Pelajaran
352

Soalan Lazim

Adakah pelajaran “Jenis gaya Result/Either” percuma?

Ya — teks penuh “Jenis gaya Result/Either” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus TypeScript Academy, tingkat taraf kepada CoddyKit PRO. Kursus TypeScript Academy merangkumi sejumlah 2 pelajaran.

Apakah yang akan saya pelajari dalam “Jenis gaya Result/Either”?

Modelkan kejayaan atau kegagalan secara jelas dengan kesatuan Result/Either, tambahkan pembantu (map/flatMap/mapError), dan kekalkan aliran yang boleh diramal tanpa try/catch di merata tempat. Anda berlatih TypeScript Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan TypeScript Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran TypeScript Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 2.

Berapa lamakah pelajaran “Jenis gaya Result/Either” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran TypeScript Academy ini?

Ya. Setiap pelajaran TypeScript Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Jenis gaya Result/Either
  2. Pengendalian ralat menyeluruh dengan kesatuan terbeza
← Kembali ke TypeScript Academy