क्रिप्टो-समुदाय-खर्च-1-मिलियन-टू-रिवाइव-एलोन-कस्तूरी-प्रेरित-टोकन-फ्लोकी-इनु.जेपीजी

टाइपस्क्रिप्ट प्रकार का संकुचन

स्रोत नोड: 1857482

कई बार हमें टाइपस्क्रिप्ट इंटरफेस के बीच अंतर करने में सक्षम होने की आवश्यकता होती है जिसमें कुछ गुण समान होते हैं। निम्नलिखित उदाहरण लें:

interface Vehicle { weight: number; wheels?: number; class?: 'A' | '1' | '2' | '3';
}

हमारे आवेदन में हमारे पास अलग-अलग वाहन हैं। ट्रकों के लिए, उदाहरण के लिए, हम उनके वजन और उनके पहियों की संख्या पर नज़र रखना चाहते हैं। हालाँकि अन्य वाहनों (जैसे याच) में कोई पहिए नहीं होते हैं, लेकिन अन्य विशेषताएँ होती हैं जिन्हें हम जानना चाहते हैं, उदाहरण के लिए उनकी कक्षा, जो एक स्ट्रिंग है जो 'A', '1', '2', या '3' मान ले सकती है। .

हम सोच सकते हैं कि एक अच्छा विन्यास इस प्रकार हो सकता है:

interface Truck { weight: number; wheels: number;
} interface Yatch { weight: number; class: 'A' | '1' | '2' | '3';
} export type Vehicle = Truck | Yatch;

हालाँकि, इस सेटअप के साथ उपयोग करने का प्रयास करते समय हमें एक समस्या होगी Vehicle वस्तुओं:

जैसा कि हम देख सकते हैं, टाइपस्क्रिप्ट यह तय नहीं कर सकता कि इनपुट ऑब्जेक्ट है या नहीं Truck या एक Yatch, और यह निम्न त्रुटि फेंकता है:

Property 'wheels' does not exist on type 'Yatch'

हम वस्तु के प्रकार को कैसे सीमित कर सकते हैं? कम से कम 3 विकल्प हैं:

1. एक नया बनाएँ type प्रत्येक इंटरफेस पर संपत्ति

interface Truck { weight: number; wheels: number; type: 'truck';
} interface Yatch { weight: number; class: 'A' | '1' | '2' | '3'; type: 'yatch';
} export type Vehicle = Truck | Yatch;

यह के रूप में जाना जाता है भेदभाव रहित संघ टाइपस्क्रिप्ट में। यह समाधान सबसे पर्याप्त होगा यदि हमारे इंटरफेस में पहले से ही था type पहले से विशेषता।

उपयोग करते समय Vehicle ऑब्जेक्ट्स, अब हम दोनों इंटरफेस को अलग करने के लिए स्विच केस का उपयोग कर सकते हैं:

यदि हम अपने प्रकारों के लिए इंटरफेस के बजाय कक्षाओं का उपयोग कर रहे हैं, तो निम्न वैकल्पिक सिंटैक्स ठीक उसी परिणाम का उत्पादन करता है:

class Truck { weight: number; wheels: number; readonly type = 'truck';
} class Yatch { weight: number; class: 'A' | '1' | '2' | '3'; readonly type = 'yatch';
} export type Vehicle = Truck | Yatch;

2. टाइप गार्ड का प्रयोग करें

गार्ड टाइप करें ऐसे कार्य हैं जो प्रकार को कम करने में मदद करते हैं।

interface Truck { weight: number; wheels: number;
} interface Yatch { weight: number; class: 'A' | '1' | '2' | '3';
} export type Vehicle = Truck | Yatch; export function isTruck(arg: any): arg is Truck { return !!arg.weight && !!arg.wheels;
} export function isYatch(arg: any): arg is Yatch { return !!arg.weight && !!arg.class;
}

If isTruck(object) रिटर्न true, इसका मतलब है कि हमारी वस्तु वास्तव में एक है Truck. हम अपने आवेदन में कहीं भी इन कार्यों को आयात और उपयोग कर सकते हैं:

हालाँकि, इस सेटअप में एक छोटी सी समस्या है: हम अभी भी निर्माण कर सकते हैं Vehicle वस्तुएं जो नहीं हैं TruckYatch:

3. "कभी नहीं" का प्रयोग करें

इस अंतिम समस्या को ठीक करने के लिए हम उपयोग कर सकते हैं la never टाइप, टाइपस्क्रिप्ट 2.0 में पेश किया गया. यदि किसी इंटरफ़ेस में प्रकार की संपत्ति है never, तो उस संपत्ति को उस इंटरफ़ेस का अनुसरण करने वाली किसी भी वस्तु पर परिभाषित नहीं किया जा सकता है।

interface Truck { weight: number; wheels: number; class?: never;
} interface Yatch { weight: number; wheels?: never; class: 'A' | '1' | '2' | '3';
} export type Vehicle = Truck | Yatch;

टाइप गार्ड ठीक वैसे ही काम करते हैं जैसे वे पहले करते थे, लेकिन अब हम नहीं बना सकते Vehicle जिन वस्तुओं में एक ही समय में दोनों होते हैं wheels और class गुण:

जैसा कि हम देख सकते हैं कि हमें निम्न त्रुटि मिलती है:

Type 'number' is not assignable to type 'never'

इस पोस्ट का स्पैनिश संस्करण मेरे ब्लॉग cibetrucos.com पर देखें

स्रोत: https://www.codementor.io/davidsilvasanmartin/typescript-भेदभाव-यूनियन्स-1jhqp24mvx

समय टिकट:

से अधिक कोडमेंटर समुदाय