我玩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'
});有办法做到这一点吗?
发布于 2020-04-26 16:56:17
您可以这样做,但是您需要进行一些更改:
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项目中看到结果
https://stackoverflow.com/questions/61443377
复制相似问题