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.
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.
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
- Result/Either tarzı türler
- Ayrıştırılmış birleşimlerle kapsamlı hata işleme