टाइपस्क्रिप्ट में प्रकारों का विस्तार करना संभव है?


156

कहो मेरे पास निम्न प्रकार है:

type Event = {
   name: string;
   dateCreated: string;
   type: string;
}

मैं अब इस प्रकार का विस्तार करना चाहता हूं, अर्थात

type UserEvent extends Event = {
   UserId: string; 
}

यह काम नहीं करता है। मैं यह कैसे कर सकता हूँ?


3
typeकीवर्ड को परिभाषित करने के लिए किया जाता है प्रकार उपनाम , नहीं इंटरफेस या वर्गों।
हेरिटिक बंदर

जवाबों:


285

कीवर्ड extendsका उपयोग केवल इंटरफेस और कक्षाओं के लिए किया जा सकता है।

यदि आप केवल एक प्रकार घोषित करना चाहते हैं जिसमें अतिरिक्त गुण हैं, तो आप प्रतिच्छेदन प्रकार का उपयोग कर सकते हैं :

type UserEvent = Event & {UserId: string}

टाइपस्क्रिप्ट 2.2 के लिए अद्यतन करें , अब एक ऐसे इंटरफ़ेस का होना संभव है जो ऑब्जेक्ट-प्रकार को बढ़ाता है , यदि प्रकार कुछ प्रतिबंधों को संतुष्ट करता है:

type Event = {
   name: string;
   dateCreated: string;
   type: string;
}

interface UserEvent extends Event {
   UserId: string; 
}

यह दूसरे तरीके से काम नहीं करता है - UserEventइंटरफ़ेस के रूप में घोषित किया जाना चाहिए, न कि typeयदि आप extendsसिंटैक्स का उपयोग करना चाहते हैं ।

और extend मनमाने प्रकारों के साथ उपयोग करना अभी भी असंभव है - उदाहरण के लिए, यह काम नहीं करता है यदि Eventकोई बाधा के बिना एक प्रकार का पैरामीटर है।


मैं TS v3.5.2 का उपयोग कर रहा हूं, और मैं एक प्रकार का इंटरफ़ेस विस्तार करने में सक्षम नहीं हूं। interface A<T> extends B<T> {blar}एक इंटरफ़ेस केवल ऑब्जेक्ट प्रकार या ऑब्जेक्ट प्रकारों के प्रतिच्छेदन को सांख्यिकीय रूप से ज्ञात सदस्यों के साथ
बढ़ा सकता है

@WORMSS ऐसा करने interface Identifiable<T> extends T { id: string }से मुझे त्रुटि मिलती है "एक इंटरफ़ेस केवल एक ऑब्जेक्ट प्रकार या ऑब्जेक्ट प्रकारों के प्रतिच्छेदन को सांख्यिकीय रूप से ज्ञात सदस्यों के साथ बढ़ा सकता है। (2312)"
maninak

22

आप प्रकारों को काट सकते हैं:

type TypeA = {
    nameA: string;
};
type TypeB = {
    nameB: string;
};
export type TypeC = TypeA & TypeB;

कहीं न कहीं आप अब कर सकते हैं:

const some: TypeC = {
    nameB: 'B',
    nameA: 'A',
};

6

आप जो हासिल करने की कोशिश कर रहे हैं वह इसके बराबर है

interface Event {
   name: string;
   dateCreated: string;
   type: string;
}

interface UserEvent extends Event {
   UserId: string; 
}

जिस प्रकार से आपने परिभाषित किया है वह विरासत को निर्दिष्ट करने की अनुमति नहीं देता है, हालांकि आप अंतरंग प्रकार का उपयोग करके कुछ इसी तरह प्राप्त कर सकते हैं, जैसा कि आर्टेम ने बताया है।


8
हाँ, लेकिन मुझे यह शब्द पसंद नहीं है, interfaceजब मेरा वास्तव में मतलब हैtype
Kousha

पर्याप्त रूप से उचित है, तो
आर्टेम

-1

नीचे हो सकता है दृष्टिकोण किसी टीएस के लिए अभिक्रिया के साथ सहायक होगा

interface Event {
   name: string;
   dateCreated: string;
   type: string;
}

interface UserEvent<T> extends Event<T> {
    UserId: string;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.