برنامه نویسی

ساده سازی تایپ باریک و محافظ در TypeScript

Summarize this content to 400 words in Persian Lang

مقدمه ای بر مفهوم باریک سازی

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

با دقت به کد نگاه کنید. توضیح در زیر قطعه کد نوشته شده است.

function padLeft(padding: number | string, input: string): string {
return ” “.repeat(padding) + input;
}

اگر padding یک است number، به عنوان تعداد فضاهایی که می‌خواهیم به آن‌ها اضافه کنیم در نظر گرفته می‌شود input از آنجایی که padding از طریق تکرار عبور کرد padding باید یک مقدار عددی باشد.

حالا، لحظه padLeft تابع فراخوانی می شود، یک خطا می دهد که تا حدودی شبیه به این است:

“آرگمون نوع “string | number” قابل انتساب به پارامتر نوع “number” نیست. نوع “string” قابل انتساب به نوع “number” نیست.”

TypeScript به ما هشدار می دهد که یک مقدار را با type ارسال می کنیم number | string به repeat تابعی که فقط a را می پذیرد number، و درست است. به عبارت دیگر، ما به صراحت اگر را بررسی نکرده ایم padding یک است number اول، و ما در مورد موردی که یک است رسیدگی نمی کنیم string، پس بیایید دقیقاً همین کار را انجام دهیم.

function padLeft(padding: number | string, input: string): string {
if (typeof padding === “number”) {
return ” “.repeat(padding) + input;
}
return padding + input;
}

وقتی می نویسیم if (typeof padding === “number”)، TypeScript می داند که ما در حال بررسی این هستیم padding یک عدد است به این نوع چک «نگهبان نوع» می گویند. TypeScript به کد نگاه می کند و سعی می کند نوع دقیق یک مقدار را کشف کند. وقتی TypeScript از طریق این بررسی‌ها یک نوع را مشخص‌تر می‌کند، به آن «تیز کردن» می‌گویند.

تایپ گارد

تایپ گارد چک‌های زمان اجرا هستند که به TypeScript اجازه می‌دهند نوع خاصی از یک متغیر را در یک بلوک شرطی استنتاج کند. TypeScript از این بررسی ها برای “محافظت” در برابر عملیات نامعتبر با اطمینان از اینکه متغیر دارای نوع مورد انتظار است، استفاده می کند.

متداول ترین نوع محافظ های داخلی در TypeScript عبارتند از:

typeof: بررسی می کند که آیا یک متغیر از نوع اولیه است (مثلاً string، number، booleanو غیره)
instanceof: بررسی می کند که آیا یک متغیر نمونه ای از یک کلاس یا تابع سازنده است.

نمونه ای از وجود دارد typeof در بخش قبلی که در آن شما می توانید ببینید که چگونه typeof یک نوع اتحادیه را به یک نوع خاص محدود می کند.

اما در اینجا یک مثال از استفاده است instanceof:

class Dog {
bark() {
console.log(“Woof!”);
}
}

class Cat {
meow() {
console.log(“Meow!”);
}
}

function animalSound(animal: Dog | Cat) {
if (animal instanceof Dog) {
animal.bark(); // TypeScript knows `animal` is a `Dog` here
} else {
animal.meow(); // TypeScript knows `animal` is a `Cat` here
}
}

در این مثال، instanceof برای محدود کردن نوع استفاده می شود animal به هر دو Dog یا Cat. این به ما امکان می دهد تا با خیال راحت روش مناسب را فراخوانی کنیم (bark() یا meow()) بر اساس نوع animal.

باریک شدن حقیقت

حقیقت ممکن است کلمه ای نباشد که در فرهنگ لغت پیدا کنید، اما بسیار چیزی است که در جاوا اسکریپت درباره آن خواهید شنید.

باریک شدن حقیقت در TypeScript به روشی اشاره دارد که TypeScript انواع را بر اساس شرایط (&&اس، ||اس، if گزاره ها، نفی های بولی (!) و بیشتر) که بررسی می کند که آیا یک مقدار “درست” یا “نادرست” است. ارزش هایی مانند false، 0، null، undefined، NaN، و “” (رشته خالی) در نظر گرفته می شوند تقلبی، در حالی که همه مقادیر دیگر هستند صداقت.

وقتی از یک استفاده می کنید if عبارت TypeScript به طور خودکار نوع را با حذف کردن محدود می کند falsy مقادیر از انواع ممکن

function printMessage(message: string | null) {
if (message) {
// TypeScript knows ‘message’ can’t be null here, it’s narrowed to ‘string’
console.log(message.toUpperCase());
} else {
console.log(“No message provided.”);
}
}

printMessage(“Hello”); // Output: HELLO
printMessage(null); // Output: No message provided.

در if (message) بلوک، TypeScript نوع را محدود می کند string | null فقط string، از آنجایی که null نادرست است و از این شرط عبور نمی کند.

همیشه می‌توانید با استفاده از عبارت، یک مقدار را به یک بولی تبدیل کنید Boolean عملکرد یا با استفاده از !! (نفی مضاعف). را !! روش یک مزیت دارد: TypeScript آن را به عنوان یک سخت درک می کند true یا false، در حالی که Boolean تابع فقط یک کلی می دهد boolean نوع

const value = “Hello”;

// Using Boolean function
const bool1 = Boolean(value); // type: boolean

// Using double negation (!!)
const bool2 = !!value; // type: true

برای مشخص بودن این موضوع را درک کنید:

bool1ارزش a است نوع بولی ارزش، یعنی می تواند هر دو باشد true یا false. TypeScript فقط می داند که یک است boolean، اما مشخص نمی کند کدام یک.
bool2مقدار a در نظر گرفته می شود نوع تحت اللفظی- یا دقیقا true یا دقیقا false، بسته به ارزش !!value. در این مورد، از آنجایی که “Hello” راست است، bool2 از نوع خواهد بود true.

باریک شدن برابری

باریک شدن برابری در TypeScript زمانی اتفاق می افتد که TypeScript نوع یک متغیر را بر اساس یک بررسی برابری (مانند === یا !==). این بدان معناست که پس از بررسی، TypeScript می‌تواند انواع احتمالی یک متغیر را «محدود» کند، زیرا اکنون اطلاعات بیشتری در مورد آن دارد.

function example(value: string | number) {
if (typeof value === “number”) {
// Here, TypeScript knows value is a number
console.log(value.toFixed(2)); // Safe to use number methods
} else {
// In this block, TypeScript narrows value to string
console.log(value.toUpperCase()); // Safe to use string methods
}
}

را in باریک شدن اپراتور

را in باریک کردن عملگر در TypeScript به ما کمک می کند تا بفهمیم آیا یک شی دارای ویژگی خاصی است یا خیر، و همچنین به TypeScript کمک می کند تا انواع را بر اساس آن بررسی اصلاح کند.

وقتی استفاده می کنید “propertyName” in object، TypeScript بررسی می کند که آیا شی (یا نمونه اولیه آن) دارای ویژگی است یا خیر. بر اساس اینکه آیا چک است true یا false، TypeScript می تواند اطلاعات بیشتری در مورد نوع آن شیء داشته باشد.

اگر چک است درست است (ویژگی وجود دارد)، TypeScript نوع شی را محدود می کند تا انواعی را که این ویژگی را دارند (اعم از الزامی یا اختیاری) شامل شود.
اگر چک است نادرست (ویژگی وجود ندارد)، TypeScript نوع را محدود می کند تا انواعی که این ویژگی را دارند حذف کند.

type Cat = { meow: () => void };
type Dog = { bark: () => void };

function speak(animal: Cat | Dog) {
if (“meow” in animal) {
// TypeScript now knows ‘animal’ must be a Cat
animal.meow();
} else {
// TypeScript now knows ‘animal’ must be a Dog
animal.bark();
}
}

در if (“meow” in animal) بررسی کنید، TypeScript بررسی می کند که آیا animal را دارد meow روش اگر اینطور باشد، TypeScript می داند که حیوان یک است گربه. اگر نه، TypeScript می داند که یک است سگ.

استفاده از محمولات نوع

محمولات را تایپ کنید در TypeScript راهی برای محدود کردن نوع متغیر با استفاده از تابعی است که یک Boolean برمی گرداند. آنها به TypeScript کمک می کنند تا بفهمد یک متغیر پس از بررسی چه نوع است.

یک محمول نوع به صورت نوشته می شود parameterName is Type. وقتی از این در یک تابع استفاده می کنید، TypeScript می داند که اگر تابع برگردد true، پارامتر از آن نوع خاص است.

type Fish = { swim: () => void };
type Bird = { fly: () => void };

function isFish(animal: Fish | Bird): animal is Fish {
return (animal as Fish).swim !== undefined; // Check if animal has a swim method
}

function move(animal: Fish | Bird) {
if (isFish(animal)) {
// TypeScript knows ‘animal’ is a Fish here
animal.swim();
} else {
// TypeScript knows ‘animal’ is a Bird here
animal.fly();
}
}

توضیح ساده:

را isFish عملکرد بررسی می کند که آیا animal دارای یک swim روش
اگر این کار را کرد، تابع برمی گردد trueو TypeScript آن را درک می کند animal یک است ماهی.
اگر اینطور نیست، TypeScript می داند که یک است پرنده.

اتحادیه های تبعیض آمیز

اتحادیه‌های متمایز الگویی در TypeScript هستند که در آن می‌توانید از یک ویژگی مشترک (به نام «تمایزکننده») برای تمایز بین انواع شی‌های مختلف در یک اتحادیه استفاده کنید.

به مثال زیر نگاه کنید.

interface Car {
kind: “car”;
drive: () => void;
}

interface Bike {
kind: “bike”;
pedal: () => void;
}

type Vehicle = Car | Bike;

function operateVehicle(vehicle: Vehicle) {
switch (vehicle.kind) {
case “car”:
vehicle.drive(); // TypeScript knows `vehicle` is a `Car` here
break;
case “bike”:
vehicle.pedal(); // TypeScript knows `vehicle` is a `Bike` here
break;
}
}

اینجا، kind اموال متمایز کننده است. TypeScript از آن برای باریک کردن استفاده می کند Vehicle به هر کدام تایپ کنید Car یا Bike بر اساس ارزش kind.

بررسی جامع بودن

بررسی جامع بودن در TypeScript تضمین می کند که تمام موارد ممکن از یک نوع اتحادیه در کد شما مدیریت می شود. وقتی از باریک کردن تایپ استفاده می کنید (مانند با if اظهارات یا switch موارد)، TypeScript بررسی می کند که آیا همه انواع در یک اتحادیه در نظر گرفته شده اند یا خیر. اگر موردی وجود نداشته باشد، TypeScript به شما خطایی می دهد و به شما کمک می کند تا اشکالات احتمالی را پیدا کنید.

type Cat = { type: “cat”; meow: () => void };
type Dog = { type: “dog”; bark: () => void };
type Animal = Cat | Dog;

function makeSound(animal: Animal) {
switch (animal.type) {
case “cat”:
animal.meow(); // TypeScript knows ‘animal’ is Cat here
break;
case “dog”:
animal.bark(); // TypeScript knows ‘animal’ is Dog here
break;
default:
// This will give an error if we add more animal types
const _exhaustiveCheck: never = animal;
throw new Error(`Unknown animal: ${animal}`);
}
}

را Animal نوع یک اتحاد از Cat و Dog. در makeSound تابع، ما بررسی می کنیم type دارایی از animal.

بررسی جامع بودن:

اگر هر دو را اداره کنیم cat و dog، همه چیز خوب است.
اگر بعداً یک نوع حیوان دیگر اضافه کنیم، مانند Birdو فراموش کنید دستور switch را به روز کنید، TypeScript یک خطا را در نشان می دهد default مورد این خطا به این دلیل رخ می دهد که default مورد اختصاص داده شده است never نوع، به این معنی که اگر همه انواع ممکن در نظر گرفته شوند، نباید اتفاق بیفتد.

روش های دیگر باریک کردن نوع

تکالیف: وقتی به هر متغیری اختصاص می دهیم، TypeScript به سمت راست تکلیف نگاه می کند و سمت چپ را به درستی باریک می کند.

let x = Math.random() < 0.5 ? 10 : “hello world!”;

باریک کردن تایپ با never type: را never type in TypeScript مقادیری را نشان می دهد که هرگز رخ نمی دهند. اغلب برای نشان دادن کدهای غیرقابل دسترسی استفاده می شود، مانند زمانی که یک تابع همیشه خطا می دهد یا یک حلقه بی نهایت دارد. وقتی TypeScript a را تشخیص می دهد never نوع، می تواند انواع را به طور موثر محدود کند.

function assertIsString(value: string | number) {
if (typeof value !== “string”) {
// If value is not a string, throw an error
throw new Error(“Not a string!”);
}
// Here, TypeScript knows ‘value’ is a string
console.log(value.toUpperCase());
}

در assertIsString تابع، اگر value یک رشته نیست، ما یک خطا پرتاب می کنیم. TypeScript درک می کند که اگر به آن برسد console.log، value باید یک رشته باشد اگر چیز دیگری بود، عملکرد به طور معمول کامل نمی شد و منجر به a می شد never نوع

آخرین کلمات

من مطمئن هستم که شما به معنای محدود کردن مفهوم هستید. ما می توانیم راه های ممکن دیگری برای محدود کردن انواع داشته باشیم. اما من معتقدم توضیحات و دانشی که تاکنون از این مقاله به دست آورده اید برای درک مفهوم و استفاده از آن بیش از اندازه کافی است. اگر این برای شما مفید بود به من اطلاع دهید.

مقدمه ای بر مفهوم باریک سازی

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

با دقت به کد نگاه کنید. توضیح در زیر قطعه کد نوشته شده است.

function padLeft(padding: number | string, input: string): string {
    return " ".repeat(padding) + input;
}

اگر padding یک است number، به عنوان تعداد فضاهایی که می‌خواهیم به آن‌ها اضافه کنیم در نظر گرفته می‌شود input از آنجایی که padding از طریق تکرار عبور کرد padding باید یک مقدار عددی باشد.

حالا، لحظه padLeft تابع فراخوانی می شود، یک خطا می دهد که تا حدودی شبیه به این است:

“آرگمون نوع “string | number” قابل انتساب به پارامتر نوع “number” نیست. نوع “string” قابل انتساب به نوع “number” نیست.”

TypeScript به ما هشدار می دهد که یک مقدار را با type ارسال می کنیم number | string به repeat تابعی که فقط a را می پذیرد number، و درست است. به عبارت دیگر، ما به صراحت اگر را بررسی نکرده ایم padding یک است number اول، و ما در مورد موردی که یک است رسیدگی نمی کنیم string، پس بیایید دقیقاً همین کار را انجام دهیم.

function padLeft(padding: number | string, input: string): string {
  if (typeof padding === "number") {
    return " ".repeat(padding) + input;
  }
  return padding + input;
}

وقتی می نویسیم if (typeof padding === "number")، TypeScript می داند که ما در حال بررسی این هستیم padding یک عدد است به این نوع چک «نگهبان نوع» می گویند. TypeScript به کد نگاه می کند و سعی می کند نوع دقیق یک مقدار را کشف کند. وقتی TypeScript از طریق این بررسی‌ها یک نوع را مشخص‌تر می‌کند، به آن «تیز کردن» می‌گویند.

تایپ گارد

تایپ گارد چک‌های زمان اجرا هستند که به TypeScript اجازه می‌دهند نوع خاصی از یک متغیر را در یک بلوک شرطی استنتاج کند. TypeScript از این بررسی ها برای “محافظت” در برابر عملیات نامعتبر با اطمینان از اینکه متغیر دارای نوع مورد انتظار است، استفاده می کند.

متداول ترین نوع محافظ های داخلی در TypeScript عبارتند از:

  • typeof: بررسی می کند که آیا یک متغیر از نوع اولیه است (مثلاً string، number، booleanو غیره)

  • instanceof: بررسی می کند که آیا یک متغیر نمونه ای از یک کلاس یا تابع سازنده است.

نمونه ای از وجود دارد typeof در بخش قبلی که در آن شما می توانید ببینید که چگونه typeof یک نوع اتحادیه را به یک نوع خاص محدود می کند.

اما در اینجا یک مثال از استفاده است instanceof:

class Dog {
  bark() {
    console.log("Woof!");
  }
}

class Cat {
  meow() {
    console.log("Meow!");
  }
}

function animalSound(animal: Dog | Cat) {
  if (animal instanceof Dog) {
    animal.bark(); // TypeScript knows `animal` is a `Dog` here
  } else {
    animal.meow(); // TypeScript knows `animal` is a `Cat` here
  }
}

در این مثال، instanceof برای محدود کردن نوع استفاده می شود animal به هر دو Dog یا Cat. این به ما امکان می دهد تا با خیال راحت روش مناسب را فراخوانی کنیم (bark() یا meow()) بر اساس نوع animal.

باریک شدن حقیقت

حقیقت ممکن است کلمه ای نباشد که در فرهنگ لغت پیدا کنید، اما بسیار چیزی است که در جاوا اسکریپت درباره آن خواهید شنید.

باریک شدن حقیقت در TypeScript به روشی اشاره دارد که TypeScript انواع را بر اساس شرایط (&&اس، ||اس، if گزاره ها، نفی های بولی (!) و بیشتر) که بررسی می کند که آیا یک مقدار “درست” یا “نادرست” است. ارزش هایی مانند false، 0، null، undefined، NaN، و "" (رشته خالی) در نظر گرفته می شوند تقلبی، در حالی که همه مقادیر دیگر هستند صداقت.

وقتی از یک استفاده می کنید if عبارت TypeScript به طور خودکار نوع را با حذف کردن محدود می کند falsy مقادیر از انواع ممکن

function printMessage(message: string | null) {
  if (message) {
    // TypeScript knows 'message' can't be null here, it's narrowed to 'string'
    console.log(message.toUpperCase());
  } else {
    console.log("No message provided.");
  }
}

printMessage("Hello");   // Output: HELLO
printMessage(null);      // Output: No message provided.

در if (message) بلوک، TypeScript نوع را محدود می کند string | null فقط string، از آنجایی که null نادرست است و از این شرط عبور نمی کند.

همیشه می‌توانید با استفاده از عبارت، یک مقدار را به یک بولی تبدیل کنید Boolean عملکرد یا با استفاده از !! (نفی مضاعف). را !! روش یک مزیت دارد: TypeScript آن را به عنوان یک سخت درک می کند true یا false، در حالی که Boolean تابع فقط یک کلی می دهد boolean نوع

const value = "Hello";

// Using Boolean function
const bool1 = Boolean(value);  // type: boolean

// Using double negation (!!)
const bool2 = !!value;         // type: true

برای مشخص بودن این موضوع را درک کنید:

  • bool1ارزش a است نوع بولی ارزش، یعنی می تواند هر دو باشد true یا false. TypeScript فقط می داند که یک است boolean، اما مشخص نمی کند کدام یک.

  • bool2مقدار a در نظر گرفته می شود نوع تحت اللفظی– یا دقیقا true یا دقیقا false، بسته به ارزش !!value. در این مورد، از آنجایی که "Hello" راست است، bool2 از نوع خواهد بود true.

باریک شدن برابری

باریک شدن برابری در TypeScript زمانی اتفاق می افتد که TypeScript نوع یک متغیر را بر اساس یک بررسی برابری (مانند === یا !==). این بدان معناست که پس از بررسی، TypeScript می‌تواند انواع احتمالی یک متغیر را «محدود» کند، زیرا اکنون اطلاعات بیشتری در مورد آن دارد.

function example(value: string | number) {
  if (typeof value === "number") {
    // Here, TypeScript knows value is a number
    console.log(value.toFixed(2));  // Safe to use number methods
  } else {
    // In this block, TypeScript narrows value to string
    console.log(value.toUpperCase());  // Safe to use string methods
  }
}

را in باریک شدن اپراتور

را in باریک کردن عملگر در TypeScript به ما کمک می کند تا بفهمیم آیا یک شی دارای ویژگی خاصی است یا خیر، و همچنین به TypeScript کمک می کند تا انواع را بر اساس آن بررسی اصلاح کند.

وقتی استفاده می کنید "propertyName" in object، TypeScript بررسی می کند که آیا شی (یا نمونه اولیه آن) دارای ویژگی است یا خیر. بر اساس اینکه آیا چک است true یا false، TypeScript می تواند اطلاعات بیشتری در مورد نوع آن شیء داشته باشد.

  • اگر چک است درست است (ویژگی وجود دارد)، TypeScript نوع شی را محدود می کند تا انواعی را که این ویژگی را دارند (اعم از الزامی یا اختیاری) شامل شود.

  • اگر چک است نادرست (ویژگی وجود ندارد)، TypeScript نوع را محدود می کند تا انواعی که این ویژگی را دارند حذف کند.

type Cat = { meow: () => void };
type Dog = { bark: () => void };

function speak(animal: Cat | Dog) {
  if ("meow" in animal) {
    // TypeScript now knows 'animal' must be a Cat
    animal.meow();
  } else {
    // TypeScript now knows 'animal' must be a Dog
    animal.bark();
  }
}

در if ("meow" in animal) بررسی کنید، TypeScript بررسی می کند که آیا animal را دارد meow روش اگر اینطور باشد، TypeScript می داند که حیوان یک است گربه. اگر نه، TypeScript می داند که یک است سگ.

استفاده از محمولات نوع

محمولات را تایپ کنید در TypeScript راهی برای محدود کردن نوع متغیر با استفاده از تابعی است که یک Boolean برمی گرداند. آنها به TypeScript کمک می کنند تا بفهمد یک متغیر پس از بررسی چه نوع است.

یک محمول نوع به صورت نوشته می شود parameterName is Type. وقتی از این در یک تابع استفاده می کنید، TypeScript می داند که اگر تابع برگردد true، پارامتر از آن نوع خاص است.

type Fish = { swim: () => void };
type Bird = { fly: () => void };

function isFish(animal: Fish | Bird): animal is Fish {
  return (animal as Fish).swim !== undefined;  // Check if animal has a swim method
}

function move(animal: Fish | Bird) {
  if (isFish(animal)) {
    // TypeScript knows 'animal' is a Fish here
    animal.swim();
  } else {
    // TypeScript knows 'animal' is a Bird here
    animal.fly();
  }
}

توضیح ساده:

  • را isFish عملکرد بررسی می کند که آیا animal دارای یک swim روش

  • اگر این کار را کرد، تابع برمی گردد trueو TypeScript آن را درک می کند animal یک است ماهی.

  • اگر اینطور نیست، TypeScript می داند که یک است پرنده.

اتحادیه های تبعیض آمیز

اتحادیه‌های متمایز الگویی در TypeScript هستند که در آن می‌توانید از یک ویژگی مشترک (به نام «تمایزکننده») برای تمایز بین انواع شی‌های مختلف در یک اتحادیه استفاده کنید.

به مثال زیر نگاه کنید.

interface Car {
  kind: "car";
  drive: () => void;
}

interface Bike {
  kind: "bike";
  pedal: () => void;
}

type Vehicle = Car | Bike;

function operateVehicle(vehicle: Vehicle) {
  switch (vehicle.kind) {
    case "car":
      vehicle.drive(); // TypeScript knows `vehicle` is a `Car` here
      break;
    case "bike":
      vehicle.pedal(); // TypeScript knows `vehicle` is a `Bike` here
      break;
  }
}

اینجا، kind اموال متمایز کننده است. TypeScript از آن برای باریک کردن استفاده می کند Vehicle به هر کدام تایپ کنید Car یا Bike بر اساس ارزش kind.

بررسی جامع بودن

بررسی جامع بودن در TypeScript تضمین می کند که تمام موارد ممکن از یک نوع اتحادیه در کد شما مدیریت می شود. وقتی از باریک کردن تایپ استفاده می کنید (مانند با if اظهارات یا switch موارد)، TypeScript بررسی می کند که آیا همه انواع در یک اتحادیه در نظر گرفته شده اند یا خیر. اگر موردی وجود نداشته باشد، TypeScript به شما خطایی می دهد و به شما کمک می کند تا اشکالات احتمالی را پیدا کنید.

type Cat = { type: "cat"; meow: () => void };
type Dog = { type: "dog"; bark: () => void };
type Animal = Cat | Dog;

function makeSound(animal: Animal) {
  switch (animal.type) {
    case "cat":
      animal.meow();  // TypeScript knows 'animal' is Cat here
      break;
    case "dog":
      animal.bark();  // TypeScript knows 'animal' is Dog here
      break;
    default:
      // This will give an error if we add more animal types
      const _exhaustiveCheck: never = animal;
      throw new Error(`Unknown animal: ${animal}`);
  }
}

را Animal نوع یک اتحاد از Cat و Dog. در makeSound تابع، ما بررسی می کنیم type دارایی از animal.

بررسی جامع بودن:

  • اگر هر دو را اداره کنیم cat و dog، همه چیز خوب است.

  • اگر بعداً یک نوع حیوان دیگر اضافه کنیم، مانند Birdو فراموش کنید دستور switch را به روز کنید، TypeScript یک خطا را در نشان می دهد default مورد این خطا به این دلیل رخ می دهد که default مورد اختصاص داده شده است never نوع، به این معنی که اگر همه انواع ممکن در نظر گرفته شوند، نباید اتفاق بیفتد.

روش های دیگر باریک کردن نوع

تکالیف: وقتی به هر متغیری اختصاص می دهیم، TypeScript به سمت راست تکلیف نگاه می کند و سمت چپ را به درستی باریک می کند.

let x = Math.random() < 0.5 ? 10 : "hello world!";

باریک کردن تایپ با never type: را never type in TypeScript مقادیری را نشان می دهد که هرگز رخ نمی دهند. اغلب برای نشان دادن کدهای غیرقابل دسترسی استفاده می شود، مانند زمانی که یک تابع همیشه خطا می دهد یا یک حلقه بی نهایت دارد. وقتی TypeScript a را تشخیص می دهد never نوع، می تواند انواع را به طور موثر محدود کند.

function assertIsString(value: string | number) {
  if (typeof value !== "string") {
    // If value is not a string, throw an error
    throw new Error("Not a string!");
  }
  // Here, TypeScript knows 'value' is a string
  console.log(value.toUpperCase());
}

در assertIsString تابع، اگر value یک رشته نیست، ما یک خطا پرتاب می کنیم. TypeScript درک می کند که اگر به آن برسد console.log، value باید یک رشته باشد اگر چیز دیگری بود، عملکرد به طور معمول کامل نمی شد و منجر به a می شد never نوع

آخرین کلمات

من مطمئن هستم که شما به معنای محدود کردن مفهوم هستید. ما می توانیم راه های ممکن دیگری برای محدود کردن انواع داشته باشیم. اما من معتقدم توضیحات و دانشی که تاکنون از این مقاله به دست آورده اید برای درک مفهوم و استفاده از آن بیش از اندازه کافی است. اگر این برای شما مفید بود به من اطلاع دهید.

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

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

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

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