برنامه نویسی

قدرت تایپ اسکریپت اپراتور راضی در کمتر از 2 دقیقه

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

const user = {
    id: 1,
    email: 'example@mail.com',
};

typeof user = {
    id: number // generated automatically
    email: string // generated automatically
};
وارد حالت تمام صفحه شوید

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

کلیدهای موجود را فقط می توان به مقداری تغییر داد که با نوع اعلام شده قبلی مطابقت داشته باشد. در این مورد، email یک رشته بود، بنابراین ما فقط می توانیم آن را به یک رشته تغییر دهیم.

این همچنین به این معنی است که جسم همیشه همان شکل مورد انتظار را حفظ خواهد کرد.

const user = {
    id: 1, // Read as number
    email: 'test@mail.com', // Read as string
};

user.email = "example@email.com";
user.email = true; // ERROR: Type 'boolean' is not assignable to type 'string'
user.notExisting = 'Test'; // ERROR: Property 'notExisting' does not exist on type '{ id: number; email: string; }'
وارد حالت تمام صفحه شوید

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

در پروژه‌های واقعی، تنها تکیه بر فرض انواع TypeScript ممکن است همیشه کارساز نباشد، زیرا ممکن است در موقعیت‌هایی قرار بگیریم که نمی‌خواهیم همه انواع را مجاز کنیم.

به همین دلیل می توانیم استفاده کنیم حاشیه نویسی متغیر.

// variable annotation
const user: Record<string, string | number | boolean> = {
    id: 1,
    email: 'test@mail.com',
};
وارد حالت تمام صفحه شوید

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

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

در این مورد، آن را نمی داند که ما یک email کلید، فقط می داند که باید یک رشته به عنوان کلید وجود داشته باشد و مقدار آن یک رشته، عدد یا بولی است.

const user: Record<string, string | number | boolean> = {
    id: 1,
    email: 'test@mail.com',
};

user.email = 'example@.com';
user.email = true;
user.notCorrectValue = {}; // ERROR: Type '{}' is not assignable to type 'string | number | boolean'

console.log(user.neverExisting); // <- We can read a value that never exists
وارد حالت تمام صفحه شوید

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

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

این رفتاری است که موارد استفاده بسیار نادری دارد این کل ایده پشت تایپ ایمن را خراب می کند نوشتن کد

ما باید تمایل داشته باشیم که فرض تایپ اسکریپت کار کند، اما واقعاً نتوانستیم کاری در مورد آن انجام دهیم… تا زمانی که satisfies اپراتور.

را satisfies عملگر، در مقایسه با روش‌های قبلی، بر روی مقادیر کار می‌کند، نه متغیرها، به این معنی که بررسی می‌کند که آیا نوع فعلی با نوع انتخابی مطابقت دارد یا نه، و فرض نوع را به TypeScript واگذار می‌کند.

const user = {
    id: 1,
    email: 'asdsadas',
} satisfies Record<string, string | number | boolean>;

user.id = "string Id"; // ERROR: Type 'string' is not assignable to type 'number'
user.email = 'example@.com';
user.test = true; // ERROR: Property 'test' does not exist on type '{ id: number; email: string; }'
user.email = true; // ERROR: Type 'boolean' is not assignable to type 'string'
وارد حالت تمام صفحه شوید

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

این اجازه می دهد تا TypeScript فرض کند که شیء اعلام شده دارای نوع مورد انتظار است و فقط حاوی آن است id مانند number و email به عنوان یک string.

را satisfies اپراتور یک چک را بدون تأثیر بر نوع ارائه می دهد.

type User = Record<string, string | number | boolean>;

const USER_: User = {
    email: '1',
} as const;

USER_.email; // <- `email` is shown as `string | number | boolean`

const USER = {
    email: '1',
} as const satisfies User;

USER.email; // <- `email` is shown as `1`
وارد حالت تمام صفحه شوید

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

با این حال قدرت واقعی از satisfies در ارتباط است as const، که در آن عدم وجود انواع رونویسی به TypeScript اجازه می دهد تا مقادیر دقیق را به توسعه دهنده نشان دهد.

پس توسعه دهنده عزیزم را به خاطر بسپار، بررسی های نوع یک شی را برآورده می کند، بدون اینکه تاثیری بر فرض TypeScript داشته باشد و باید یکی از متحدان اصلی شما دوباره تایپ اشیاء ثابت باشد.

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

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

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

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