أنواع سلاسل القالب المطبوع عليها علامات تمييز

أنواع حرفية للقالب محسّنة باستخدام Typescript 4.5

ما هو "التضييق" في 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;
    }
}

والآن أنت تعرف كيفية تضييق نطاق الحرف الحرفية للقالب في تنضيد! قد تكون هذه ميزة لن تستخدمها كثيرًا ، ولكن عندما يكون ذلك مناسبًا ، أعتقد أنها يمكن أن تقلل إلى حد كبير من تعقيد الكود وتحافظ على قاعدة الكود الخاصة بك أنظف قليلاً مما هي بدون الميزة.

الاقتراحات

ذات صلة

ملحق

اللغات