मैंने 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'
});

क्या इसे हासिल करने का कोई तरीका है?

0
ChristianMurschall 26 अप्रैल 2020, 18:30

1 उत्तर

सबसे बढ़िया उत्तर

आप यह कर सकते हैं, लेकिन आपको कुछ बदलावों की आवश्यकता होगी:

  1. LocationId और LocationCoordinates कक्षाएं होनी चाहिए
  2. आपको इनपुट प्रॉपर्टी में एक @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
}
  1. आपको अपने इनपुट में एक type प्रॉपर्टी जोड़नी चाहिए, ताकि TS भी संघ के बीच भेदभाव कर सके:
 // raw input for LocationCoordinates
const rawLocationCoordinates = {
   data: {
       type: "coordinate",
       longitude: 22,
       latitude: 33
   },
   searchRadiusInKm: 30
}

आप मेरे द्वारा स्थापित इस StackBlitz प्रोजेक्ट में परिणाम देख सकते हैं

1
leonardfactory 26 अप्रैल 2020, 19:56