برنامه نویسی

رسیدگی به خطاها در TypeScript: متوقف کردن پرتاب ، شروع به بازگشت

در TypeScript ، ما اغلب فرض می کنیم که توابع همیشه برگرد مقادیر مورد انتظار آنها اما چه اتفاقی می افتد که مشکلی پیش بیاید؟ بسیاری از کارکردها می توانند خطاها را پرتاب کنید، اما TypeScript هنوز هم آنها را تایپ می کند که گویی همیشه موفق می شوند. این می تواند به تصادفات غیر منتظره و اطلاعات گمراه کننده منجر شود.

بیایید این را با یک مثال تجزیه کنیم و ببینیم چگونه neverthrow آن را برطرف می کند – حتی بدون نیاز به انواع صریح!

مشکل: استثنائات پنهان

بیایید بگوییم که ما تابعی داریم که سن کاربر را از یک پایگاه داده می گیرد. اگر شناسه کاربر نامعتبر باشد ، خطایی را به وجود می آورد.

function getUserAge(userId: number) {
    if (userId < 0) throw new Error("Invalid user ID");

    return 25; // Fake age for demo
}

const age = getUserAge(-1); // This might throw an error, yet it's typed as number
console.log("User age:", age);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

چرا این یک مشکل است؟

  1. نوع گمراه کننده: Infers Typescript getUserAge() به عنوان تعداد بازگشت ، حتی اگر می تواند خطایی را به وجود آورد.
  2. تصادفات غیر منتظره: اگر یک شناسه کاربر نامعتبر منتقل شود ، این عملکرد هرگز در واقع برمی گردد و به جای آن پرتاب می شود!
  3. بدون نوع ایمنی برای خطاها: هیچ چیز در امضای عملکرد وجود ندارد که ممکن است خطایی به ما هشدار دهد.

وقتی معلق هستید getUserAge، TypeScript نادرست نشان می دهد:

function getRandomNumber(): number
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

راه حل: استفاده neverthrow

به جای پرتاب خطا ، بیایید استفاده کنیم neverthrow برای بازگشت صریح آنها:

import { ok, err } from "neverthrow";

function getUserAge(userId: number) {
    if (userId < 0) return err("Invalid user ID"); // Explicit error

    return ok(25); // Success case
}

const ageResult = getUserAge(-1);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

چه نوع متن به طور خودکار: به طور خودکار:

function getRandomNumber(): Err<never, "Invalid user ID"> | Ok<number, never>
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • Ok -> در صورت موفقیت ، شماره ای را در خود جای داده است.
  • Err -> در صورت عدم موفقیت ، آن را نگه می دارد رشته خطای دقیقبشر

چرا این بهتر است؟

  1. دیگر استثنائی پنهان نیست: ما هرگز خطا نمی کنیم ، بنابراین برنامه ما هرگز به طور غیر منتظره خراب نمی شود.
  2. انواع خطای دقیق تر: به جای استفاده از عمومی string یا Error، TypeScript به طور خودکار مقادیر خطای دقیق را به خود جلب می کند.
  3. رسیدگی صریح و ایمن: از آنجا که نتیجه ما را وادار می کند تا هر دو مورد را اداره کنیم ، ما کد واضح تر و ایمن تر می نویسیم:
if (ageResult.isErr()) {
    console.error("Error:", ageResult.error); // Typed as "Invalid user ID"
} else {
    console.log("User age:", ageResult.value); // Typed as number
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

حتی بهتر: دست زدن به عملکرد

به جای استفاده if اظهارات ، ما می توانیم نتیجه را با آن زنجیر کنیم .map() وت .mapErr():

ageResult
    .map(age => console.log("User age:", age)) // Runs if success
    .mapErr(error => console.error("Error:", error)); // Runs if failure
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این باعث می شود کد ما تمیزتر و خواندن آسان تر شود!

غذای نهایی

با استفاده از neverthrow استثنائات پنهان را از بین می برد و کد را قابل پیش بینی تر می کند. به جای پرتاب خطا ، ما آنها را صریح باز می گردانیم ، و اطمینان می دهیم که TypeScript به درستی از موارد موفقیت و عدم موفقیت در آن جلوگیری می کند.

این رویکرد مانع از گمراه کننده انواع و تصادفات غیر منتظره ضمن مجبور کردن خطای مناسب می شود. TypeScript به طور طبیعی انواع دقیقی را نشان می دهد و منجر به کاربردهای تمیزتر ، ایمن تر و قابل اطمینان تر می شود.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا