मैंने routing-controllers
के साथ खेला और यह बिल्ट-इन क्लास-ट्रांसफार्मर क्षमता है। मैंने एक इंटरफ़ेस बनाने की कोशिश की जहां मैं location id
या location coordinate
के आधार पर एक खोज क्वेरी कर सकता हूं। इसलिए मेरा इरादा एक भेदभावपूर्ण संघ को एक के रूप में उपयोग करने का था body पैरामीटर और इसे काम पर नहीं ला सका। (अंतिम कंसोल आउटपुट देखें कि 'काम नहीं कर रहा' से मेरा क्या मतलब है)
उदाहरण के तौर पे:
interface LocationCoordinates {
type: 'coordinate'
longitude: number
latitude: number
}
interface LocationId {
type: 'id'
id: number
}
class LocationRadius {
data: LocationCoordinates | LocationId
searchRadiusInKm: number
}
// raw input for LocationCoordinates
const rawLocationCoordinates = {
data: {
longitude: 22,
latitude: 33
},
searchRadiusInKm: 30
}
// raw input for LocationId
const rawLocationId = {
data: {
id: 1
},
searchRadiusInKm: 30
}
// transfrom both raw inputs
const realLocationCoordinates = plainToClass(LocationRadius, rawLocationCoordinates);
const realLocationId = plainToClass(LocationRadius, rawLocationId);
console.log({
coordinateType: realLocationCoordinates.data.type, // expect 'coordinate' but got 'undefinded'
idType: realLocationId.data.type // expect 'id' but got 'undefinded'
});
क्या इसे हासिल करने का कोई तरीका है?
1 उत्तर
आप यह कर सकते हैं, लेकिन आपको कुछ बदलावों की आवश्यकता होगी:
LocationId
औरLocationCoordinates
कक्षाएं होनी चाहिए- आपको इनपुट प्रॉपर्टी में एक
@Type
डेकोरेटर जोड़ना चाहिए। यहclass-transformer
को एक विशिष्ट विभेदक पैरामीटर के आधार पर अक्रमांकन को संभालने की अनुमति देता है
class LocationRadius {
@Type(() => Object, {
keepDiscriminatorProperty: true,
discriminator: {
property: "type",
subTypes: [
{ value: LocationCoordinates, name: "coordinate" },
{ value: LocationId, name: "id" }
]
}
})
data: LocationCoordinates | LocationId
searchRadiusInKm: number
}
- आपको अपने इनपुट में एक
type
प्रॉपर्टी जोड़नी चाहिए, ताकि TS भी संघ के बीच भेदभाव कर सके:
// raw input for LocationCoordinates
const rawLocationCoordinates = {
data: {
type: "coordinate",
longitude: 22,
latitude: 33
},
searchRadiusInKm: 30
}
आप मेरे द्वारा स्थापित इस StackBlitz प्रोजेक्ट में परिणाम देख सकते हैं
संबंधित सवाल
नए सवाल
typescript
टाइपस्क्रिप्ट जावास्क्रिप्ट का एक टाइप किया हुआ सुपरसेट है जो सादे जावास्क्रिप्ट को संकलित करता है। यह जावास्क्रिप्ट में वैकल्पिक प्रकार, कक्षाएं, इंटरफेस और मॉड्यूल जोड़ता है। यह टैग टाइपस्क्रिप्ट के लिए विशिष्ट प्रश्नों के लिए है। इसका उपयोग सामान्य जावास्क्रिप्ट प्रश्नों के लिए नहीं किया जाता है।