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.
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.
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
- Jenis gaya Result/Either
- Pengendalian ralat menyeluruh dengan kesatuan terbeza