قدرت تایپ اسکریپت اپراتور راضی در کمتر از 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 داشته باشد و باید یکی از متحدان اصلی شما دوباره تایپ اشیاء ثابت باشد.