首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >受歧视联盟的阶级变换

受歧视联盟的阶级变换
EN

Stack Overflow用户
提问于 2020-04-26 15:30:24
回答 1查看 1.1K关注 0票数 0

我玩routing-controllers,这是内置的类变压器能力。我试图构建一个接口,可以在其中执行基于location idlocation coordinate的搜索查询。因此,我打算使用歧视结合作为body参数,但无法使其工作。(参见最后一次控制台输出,我的意思是“不工作”)

例如:

代码语言:javascript
复制
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'
});

有办法做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-26 16:56:17

您可以这样做,但是您需要进行一些更改:

  1. LocationIdLocationCoordinates应该是类
  2. 您应该向输入属性添加一个@Type装饰符。这允许class-transformer根据特定的鉴别器参数处理反序列化。
代码语言:javascript
复制
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也可以在联合之间进行区分:
代码语言:javascript
复制
 // raw input for LocationCoordinates
const rawLocationCoordinates = {
   data: {
       type: "coordinate",
       longitude: 22,
       latitude: 33
   },
   searchRadiusInKm: 30
}

您可以在我设置的这个StackBlitz项目中看到结果

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61443377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档