मेरे पास एक एकल प्रकार की बाधा के साथ इस तरह का एक सामान्य इंटरफ़ेस है:
export interface IExample<T extends MyClass> {
getById(id: number): T;
}
क्या केवल एक के बजाय कई प्रकार की बाधाओं को निर्दिष्ट करना संभव है?
जवाबों:
टाइपस्क्रिप्ट सामान्य प्रकारों के लिए कई उत्तराधिकार प्राप्त करने के लिए एक सिंटैक्स की पेशकश नहीं करता है। हालाँकि, आप यूनियन प्रकार और Intersection प्रकारों का उपयोग करके समान शब्दार्थ प्राप्त कर सकते हैं। अपने मामले में, आप एक चौराहा चाहते हैं:
interface Example<T extends MyClass & OtherClass> {}
दोनों प्रकार के संघ के लिए:
interface Example<T extends MyClass | OtherClass> {}
<T extends MyInterfaceA & MyInterfaceB>
आवश्यकता है कि प्रकार दोनों इंटरफेस को लागू करें।
extends A|B
ए या बी extends A & B
का विस्तार है जैसा कि दोनों का विस्तार है! इसलिए हो सकता है कि आप अपने उत्तर में दोनों निर्दिष्ट करें ....
इसके लिए एक कार्य सुपर-इंटरफ़ेस का उपयोग करना होगा (जो इस सवाल का जवाब भी देता है कि "आप एक वर्ग से एक इनहेरिट करने की अनुमति क्यों देंगे")।
interface ISuperInterface extends MyClass, OtherClass {
}
export interface IExample<T extends ISuperInterface> {
getById(id: number): T;
}
एक वर्ग से प्राप्त एक इंटरफ़ेस के बारे में टिप्पणी को देखें ... एक नाम में क्या है?
मैंने इसे 0.9.0 कल्पना की धारा 3.5 में पाया:
इंटरफ़ेस घोषणाएं केवल नाम प्रकार का परिचय देती हैं, जबकि वर्ग घोषणाएं नाम प्रकार और निर्माण कार्यों का परिचय देती हैं जो उन नामित प्रकारों के कार्यान्वयन के उदाहरण बनाते हैं। वर्ग और इंटरफ़ेस घोषणाओं द्वारा शुरू किए गए नाम प्रकार में केवल मामूली अंतर होते हैं (कक्षाएं वैकल्पिक सदस्यों की घोषणा नहीं कर सकती हैं और इंटरफेस निजी सदस्यों की घोषणा नहीं कर सकते हैं) और अधिकांश संदर्भों में विनिमेय हैं। विशेष रूप से, केवल सार्वजनिक सदस्यों के साथ वर्ग की घोषणाएं नाम प्रकार का परिचय देती हैं जो बिल्कुल इंटरफ़ेस घोषणाओं द्वारा बनाए गए कार्यों की तरह कार्य करती हैं।