मैं एक अमूर्त वर्ग के लिए एक अमूर्त निर्माता कैसे बना सकता हूं?
उदाहरण के लिए, यदि मेरे पास यह अमूर्त वर्ग है:
export abstract class Foo<T> extends Bar<T> {
constructor(someParam: any) {
super();
this.someObj = someParam;
}
}
फिर इसका सेवन इस वर्ग द्वारा किया जाता है:
export class FooImpl extends Foo<SomeType> {
}
अगर मैं कंस्ट्रक्टर को ओवरराइड नहीं करता तो FooImpl
क्लास पर डिफॉल्ट पैरामीटरलेस कंस्ट्रक्टर का इस्तेमाल किया जाएगा जिससे क्लास के भीतर एक अनुचित स्थिति पैदा हो जाएगी।
जब Foo<T>
का उपभोग किया जाता है तो मैं एक अमूर्त निर्माता को कैसे परिभाषित कर सकता हूं या अमूर्त वर्ग के उपभोक्ताओं को कन्स्ट्रक्टर को ओवरराइड करने के लिए मजबूर कर सकता हूं?
संपादित करें
मेरे पास सटीक कोड नीचे है और ऐसा प्रतीत होता है कि यह किसी भी तरह बनाम कोड से संबंधित है
export abstract class FireStoreDataSource<T> extends DataSource<T> {
constructor(store: () => Observable<T[]>) {
super();
}
}
फिर मैं इस वर्ग का विस्तार इस प्रकार कर रहा हूँ
export class AssessmentCenterDataSource extends FireStoreDataSource<AssessmentCenter> {
}
फिर कोणीय घटक में एक उदाहरण बनाना ngOnInit
ngOnInit() {
this.dataSource = new AssessmentCenterDataSource(() => this.service.getData());
}
यहाँ vscode में मुझे कंपाइलर त्रुटि [ts] Expected 0 arguments, but got 1.
मिल रही है, हालाँकि जब मैं ng build
चलाता हूँ तो यह सही ढंग से बनता है
अगर मैं कंस्ट्रक्टर को कुछ भी पास नहीं करता हूं तो कंपाइलर त्रुटि दूर हो जाती है और जब मैं ng build
चलाता हूं तो मुझे एक त्रुटि मिलती है जो कि error TS2554: Expected 1 arguments, but got 0.
है
तो ऐसा लगता है कि यह बनामकोड या टाइपस्क्रिप्ट के बजाय मेरे द्वारा इंस्टॉल किए गए ऐडऑन में से एक के साथ एक समस्या हो सकती है
मैं कोणीय 6 के साथ vscode इनसाइडर 1.26.0 और टाइपस्क्रिप्ट इनसाइडर 3.0.1 का उपयोग कर रहा हूं
2 जवाब
दरअसल टाइपस्क्रिप्ट में यदि आप कंस्ट्रक्टर को ओवरराइड नहीं करते हैं, तो कंस्ट्रक्टर को बेस क्लास के रूप में विरासत में मिला है।
तो आपके मामले में यह अमान्य होगा:
new FooImpl(); // error
आपको बेस क्लास द्वारा आवश्यक पैरामीटर पास करने के लिए मजबूर होना पड़ेगा:
new FooImpl("") //ok
व्युत्पन्न प्रकार को कंस्ट्रक्टर को ओवरराइड करने के लिए बाध्य करने का कोई तरीका नहीं है, लेकिन चूंकि बेस कंस्ट्रक्टर विरासत में मिला है, इसलिए यह काफी अच्छा लगता है।
new
का उदाहरण बनाना FooImpl
एक त्रुटि उत्पन्न करता है (जब कंस्ट्रक्टर को कोई आर्ग्स पास नहीं किया जाता है, क्योंकि कंस्ट्रक्टर विरासत में मिलता है) जिससे कंस्ट्रक्टर के उपयोग को args के साथ मजबूर किया जाता है:
const f = new FooImpl();
Expected 1 arguments, but got 0.
new AssessmentCenterDataSource(....)
को कोई फ़ंक्शन पास नहीं किया जाता है तो मुझे एक त्रुटि मिलती है
संबंधित सवाल
नए सवाल
typescript
टाइपस्क्रिप्ट जावास्क्रिप्ट का एक टाइप किया हुआ सुपरसेट है जो सादे जावास्क्रिप्ट को संकलित करता है। यह जावास्क्रिप्ट में वैकल्पिक प्रकार, कक्षाएं, इंटरफेस और मॉड्यूल जोड़ता है। यह टैग टाइपस्क्रिप्ट के लिए विशिष्ट प्रश्नों के लिए है। इसका उपयोग सामान्य जावास्क्रिप्ट प्रश्नों के लिए नहीं किया जाता है।
class
सिंटैक्स की आवश्यकता है। यदि आपने उपवर्ग में एक कंस्ट्रक्टर जोड़ा है औरsuper
को कॉल नहीं किया है, तो यह एक त्रुटि होगी।