आप टाइपस्क्रिप्ट जेनरिक के लिए कई प्रकार की बाधाओं को निर्दिष्ट कर सकते हैं


83

मेरे पास एक एकल प्रकार की बाधा के साथ इस तरह का एक सामान्य इंटरफ़ेस है:

export interface IExample<T extends MyClass> {
    getById(id: number): T;
}

क्या केवल एक के बजाय कई प्रकार की बाधाओं को निर्दिष्ट करना संभव है?

जवाबों:


87

टाइपस्क्रिप्ट सामान्य प्रकारों के लिए कई उत्तराधिकार प्राप्त करने के लिए एक सिंटैक्स की पेशकश नहीं करता है। हालाँकि, आप यूनियन प्रकार और Intersection प्रकारों का उपयोग करके समान शब्दार्थ प्राप्त कर सकते हैं। अपने मामले में, आप एक चौराहा चाहते हैं:

interface Example<T extends MyClass & OtherClass> {}

दोनों प्रकार के संघ के लिए:

interface Example<T extends MyClass | OtherClass> {}

4
यूनियन प्रकार इसे प्राप्त करने का एक शानदार तरीका है क्योंकि आपको बाधा के एकमात्र उद्देश्य के लिए इंटरफ़ेस बनाने की आवश्यकता नहीं है। वे 2013 में वापस मौजूद नहीं थे - लेकिन यह निश्चित रूप से है कि मैं इसे अब कैसे करने की सलाह दूंगा।
फेंटन

5
यह उत्तर गलत है। संघ प्रकारों में दो अलग-अलग प्रकारों के विस्तार के समान शब्दार्थ नहीं होते हैं।
8

3
@ एलेक्स जी सुनिश्चित करें कि यह दो प्रकारों के विस्तार के समान नहीं है, लेकिन दो इंटरफेस को लागू करने के समान है।
एसटीओ

6
यह भी ध्यान रखें कि टाइपस्क्रिप्ट प्रतिच्छेदन प्रकारों का भी समर्थन करता है। इसलिए <T extends MyInterfaceA & MyInterfaceB>आवश्यकता है कि प्रकार दोनों इंटरफेस को लागू करें।
टायलर क्लाउटियर

2
जहाँ तक मैं समझता हूँ कि शब्दार्थ extends A|Bए या बी extends A & Bका विस्तार है जैसा कि दोनों का विस्तार है! इसलिए हो सकता है कि आप अपने उत्तर में दोनों निर्दिष्ट करें ....
पिपो

34

इसके लिए एक कार्य सुपर-इंटरफ़ेस का उपयोग करना होगा (जो इस सवाल का जवाब भी देता है कि "आप एक वर्ग से एक इनहेरिट करने की अनुमति क्यों देंगे")।

interface ISuperInterface extends MyClass, OtherClass {

}

export interface IExample<T extends ISuperInterface> {
    getById(id: number): T;
}

12
यह सही उपाय है। दो वर्गों से एक इंटरफ़ेस का विस्तार करना डरावना है, हालांकि - अगर दोनों निजी सदस्यों की घोषणा करते हैं, तो इंटरफ़ेस अप्रभावी है
रयान कैवानुआग

1

एक वर्ग से प्राप्त एक इंटरफ़ेस के बारे में टिप्पणी को देखें ... एक नाम में क्या है?

मैंने इसे 0.9.0 कल्पना की धारा 3.5 में पाया:

इंटरफ़ेस घोषणाएं केवल नाम प्रकार का परिचय देती हैं, जबकि वर्ग घोषणाएं नाम प्रकार और निर्माण कार्यों का परिचय देती हैं जो उन नामित प्रकारों के कार्यान्वयन के उदाहरण बनाते हैं। वर्ग और इंटरफ़ेस घोषणाओं द्वारा शुरू किए गए नाम प्रकार में केवल मामूली अंतर होते हैं (कक्षाएं वैकल्पिक सदस्यों की घोषणा नहीं कर सकती हैं और इंटरफेस निजी सदस्यों की घोषणा नहीं कर सकते हैं) और अधिकांश संदर्भों में विनिमेय हैं। विशेष रूप से, केवल सार्वजनिक सदस्यों के साथ वर्ग की घोषणाएं नाम प्रकार का परिचय देती हैं जो बिल्कुल इंटरफ़ेस घोषणाओं द्वारा बनाए गए कार्यों की तरह कार्य करती हैं।


वैकल्पिक वर्ग के सदस्यों को अब लागू किया गया है: github.com/Microsoft/TypeScript/pull/8625
स्टीफन रीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.