ما هو "التضييق" في TS؟
قبل أن نلقي نظرة على تحسين الأنواع الحرفية في نسخة 4.5 وما بعدها ، أريد فقط بسرعة تلخيص معنى "التضييق" في هذا السياق. في الأساس ، يمكنك تضييق نوع في Typescript عن طريق التحقق من خصائص الكيان. إذا كانت الخاصية موجودة في الكيان المتاح فقط لنوع معين ، فإن أداة التنصيب تتفهم ذلك ويمكنها بالتالي توفير الأنواع الصحيحة.
يوضح المثال التالي من التعليمات البرمجية ما أعنيه بذلك.
type Addition = {
sum: number;
}
type Subtraction = {
result: number;
}
function calculate(action: Addition | Subtraction) {
if ('sum' in action) {
// Simple example of using properties
// of an entity to narrow down its
// actual type.
//
// 'action' is at this point of type
// 'Addition'. Nice!
const addition = action;
}
}
تضييق أنواع سلاسل القوالب
بدءًا من الإصدار 4.5 من Typescript ، يمكن أيضًا تطبيق هذا النمط على الأنواع الحرفية للقالب ، والتي تُعرف أيضًا باسم تلك السلاسل الخاصة مع backticks. أصبحت مطابقة الأنماط قوية حقًا في اللغة.
بالطبع ، لكي يصبح التضييق قابلاً للاستخدام ، يجب أن تشترك جميع أنواع المقارنة في نفس مفتاح الخاصية. خلاف ذلك ، يمكنك ببساطة استخدام التضييق المشترك كما هو مذكور أعلاه.
يوضح المثال التالي من التعليمات البرمجية كيف يمكن لـ Template Strings استخدام التضييق:
type Addition = {
variant: `${string}-addition`;
sum: number;
}
type Subtraction = {
variant: `${string}-subtraction`;
result: number;
}
function process(action: Addition | Subtraction) {
if (action.variant === "simple-addition") {
// Stupid simple example, but you get the idea:
// We used 'simple-addition', and the pattern
// matching by TS understood that '...-addition'
// can be discriminated to 'Addition'.
const addition = action;
}
}
//
// Example that DOES NOT work.
//
// This demo illustrates that the
// discriminante has to be a string,
// else the pattern matching worn't work.
type Addition = {
variant: `${string}-arithemtic`;
sum: number;
}
type Subtraction = {
variant: `${number}-arithemtic`;
result: number;
}
function process(action: Addition | Subtraction) {
if (action.variant === "123-arithemtic") {
// Still 'Addion | Subtraction',
// as we can only compare against
// a string '123-arithmetic', which
// is of course the same for both.
const addition = action;
}
}
والآن أنت تعرف كيفية تضييق نطاق الحرف الحرفية للقالب في تنضيد! قد تكون هذه ميزة لن تستخدمها كثيرًا ، ولكن عندما يكون ذلك مناسبًا ، أعتقد أنها يمكن أن تقلل إلى حد كبير من تعقيد الكود وتحافظ على قاعدة الكود الخاصة بك أنظف قليلاً مما هي بدون الميزة.