【问题标题】:class transformation of discriminated unions受歧视工会的阶级转变
【发布时间】:2020-04-27 00:56:17
【问题描述】:

我玩过routing-controllers,它具有内置的类转换器能力。我尝试构建一个界面,我可以在其中执行基于location idlocation coordinate 的搜索查询。所以我打算使用 discriminated union 作为正文参数,但无法让它工作。 (请参阅最后一个控制台输出,我所说的“不工作”是什么意思)

举个例子:

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'
});

有没有办法做到这一点?

【问题讨论】:

    标签: typescript class-transformer


    【解决方案1】:

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

    1. LocationIdLocationCoordinates 应该是类
    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 project看到结果

    【讨论】:

    • 非常感谢!我一定监督过了。自述文件中甚至还有一个示例。再次感谢!
    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 2017-06-08
    • 2023-02-19
    • 2011-03-19
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2019-05-04
    相关资源
    最近更新 更多