टाइपस्क्रिप्ट टेम्प्लेट स्ट्रिंग प्रकार भेदभाव के रूप में

टाइपप्रति 4.5 . के साथ बेहतर टेम्पलेट शाब्दिक प्रकार

टीएस में "संकीर्ण" क्या है?

इससे पहले कि हम टाइपस्क्रिप्ट 4.5 और बाद में शाब्दिक प्रकारों के संवर्द्धन पर एक नज़र डालें, मैं जल्दी से इस संदर्भ में "संकीर्ण" का वास्तव में अर्थ देना चाहता हूं। मूल रूप से आप इकाई के गुणों की जाँच करके टाइपस्क्रिप्ट में एक प्रकार को सीमित कर सकते हैं। यदि कोई संपत्ति उस इकाई पर मौजूद है जो केवल एक निश्चित प्रकार के लिए उपलब्ध है, तो टाइपस्क्रिप्ट इसे समझता है और इसलिए सही प्रकार प्रदान कर सकता है।

निम्नलिखित कोड उदाहरण दर्शाता है कि मेरा क्या मतलब है।

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 से शुरू होकर, इस पैटर्न को टेम्प्लेट शाब्दिक प्रकारों के लिए भी लागू किया जा सकता है, जिन्हें बैकटिक्स के साथ विशेष स्ट्रिंग्स के रूप में भी जाना जाता है। भाषा में पैटर्न मिलान वास्तव में शक्तिशाली होता जा रहा है।

बेशक, उपयोग करने योग्य बनने के लिए, तुलना में सभी प्रकारों को समान संपत्ति कुंजी साझा करनी होगी। अन्यथा, आप ऊपर की तरह सामान्य संकुचन का सरल उपयोग कर सकते हैं।

निम्न कोड उदाहरण दिखाता है कि टेम्प्लेट स्ट्रिंग्स कैसे संकीर्णता का उपयोग कर सकते हैं:

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;
    }
}

और अब आप टाइपस्क्रिप्ट में टेम्प्लेट लिटरल्स को कम करने के बारे में जानते हैं! यह एक ऐसी सुविधा हो सकती है जिसका आप अक्सर उपयोग नहीं करते हैं, लेकिन जब यह उपयुक्त होता है, तो मुझे लगता है कि यह कोड जटिलता को बहुत कम कर सकता है और सुविधा के बिना आपके कोडबेस को थोड़ा साफ रख सकता है।

सुझाव

संबंधित

परिशिष्ट

भाषाएँ