TypeScript Academy · Ders

Result/Either tarzı türler

Başarıyı ve başarısızlığı bir Result/Either birleşimiyle açıkça modelleyin, yardımcılar (map/flatMap/mapError) ekleyin ve her yerde try/catch kullanmadan akışları öngörülebilir tutun.

1. ders / 28 adım

Result/Either tarzı türler, CoddyKit'te ücretsiz bir TypeScript Academy dersidir. Bu, 2 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, TypeScript Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. TypeScript Academy kursu toplamda 2 dersten oluşur.

Giriş

Amaç: Başarısızlıkları görünür kılmak. Sonuçları ayrımlı bir birleşim türüyle modelleyecek, yardımcılarla birleştirecek ve sınırda istisnaları dönüştüreceksiniz.

  • Sonuç türü
  • map/flatMap/mapError
  • HTTP tümleştirmesi

Sonuç temelleri

Küçük bir Sonuç yardımcı programı oluşturun: ok/err oluşturucularının yanı sıra birleştirme için map, flatMap, mapError.

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))
}

Alan hataları

Alan hatalarını, bir tag içeren ayrımlı bir birleşim türü olarak modelleyin. Her dal, iyi iletiler oluşturmak için kesin veriler taşır.

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) })
}

Akışları birleştirme

Doğrulamaları flatMap ile birleştirin. Derleme zamanında tüm durumların ele alınmasını zorunlu kılmak için never denetimiyle bir switch kullanın.

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
  }
}

İstisnadan Sonuç'a

Girdi/çıktı sınırlarında istisnaları sarın ve bunları Result değerlerine dönüştürün. Çağıranlar, ele alacakları tek bir hata yolunu korur.

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))
}

HTTP eşleme ipuçları

HTTP tümleştirmesi: alan hatalarını 400/409, girdi/çıktı istisnalarını 502/503 kodlarına eşleyin. Denetleyicilerin temiz ve öngörülebilir kalması için küçük bir eşleyici işlevi kullanın.

Sonuç yararı denetimi

Hızlı denetim: Neden ayrımlı bir Result birleşim türü tercih edilir?

Özet

Özet: Küçük bir Result türü tanımlayın, map/flatMap ile birleştirin, alan hatalarını birleşim türleri olarak modelleyin ve sınırdaki istisnaları dönüştürün.

Başlamak ücretsiz

Yapay zeka eğitmeniyle TypeScript öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
101
Dersler
352

Sıkça Sorulan Sorular

“Result/Either tarzı türler” dersi ücretsiz mi?

Evet — “Result/Either tarzı türler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve TypeScript Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. TypeScript Academy kursu toplamda 2 dersten oluşur.

“Result/Either tarzı türler” dersinde ne öğreneceğim?

Başarıyı ve başarısızlığı bir Result/Either birleşimiyle açıkça modelleyin, yardımcılar (map/flatMap/mapError) ekleyin ve her yerde try/catch kullanmadan akışları öngörülebilir tutun. TypeScript Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

TypeScript Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te TypeScript Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 2 dersinin 1. dersidir.

“Result/Either tarzı türler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu TypeScript Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her TypeScript Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Result/Either tarzı türler
  2. Ayrıştırılmış birleşimlerle kapsamlı hata işleme
← TypeScript Academy Sayfasına Dön