कई बार हमें टाइपस्क्रिप्ट इंटरफेस के बीच अंतर करने में सक्षम होने की आवश्यकता होती है जिसमें कुछ गुण समान होते हैं। निम्नलिखित उदाहरण लें:
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
वस्तुएं जो नहीं हैं Truck
न Yatch
:
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