【问题标题】:Typescript How to initialize mixed type array with class-transformerTypescript 如何使用类转换器初始化混合类型数组
【发布时间】:2021-12-02 23:40:47
【问题描述】:

我的类具有数组类型的属性成员,数组中的项目可以是多种类型,例如 MetaViewDatalinked 或 MetaViewContainer,请参见下面的示例

class MetaViewContainer{
      children: (MetaViewDatalinked | MetaViewContainer)[];
}

class MetaViewDatalinked{
     id: string;
}

我想使用类转换器 (plainToClass(MetaViewContainer, json)) 来初始化类及其属性。

如果我有没有数组的类,见下文,我会使用@Type

class MetaViewContainer{
          @Type((typeHelpOptions: TypeHelpOptions) => {
               if (typeHelpOptions.object.container)
                   return MetaViewContainer;
               return MetaViewDatalinked;
           })
          child: MetaViewDatalinked | MetaViewContainer;
    }

问题是@Type 仅被调用一次,无论属性的类型如何:一个类或一个类数组,因此创建了一个单一类型的数组(如果属性是数组)。

非常感谢任何解决问题的想法。

【问题讨论】:

    标签: javascript arrays typescript class-transformer


    【解决方案1】:

    我通过使用 @Transform 装饰器解决了这个问题

    class MetaViewContainer{
                @Transform((params: TransformFnParams) => {
                     const children: (MetaViewDatalinked | MetaViewContainer)[] = [];
                     if (!params.value) return children;
                     if (Array.isArray(params.value)) {
                        for (const item of params.value) {
                            if (item.children)
                              children.push(plainToClass(MetaViewContainer, item));
                            else
                              children.push(plainToClass(MetaViewDatalinked, item));
                         }
                      }        
                      return children;
              })
              children: (MetaViewDatalinked | MetaViewContainer)[];
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-08
      • 2019-10-19
      • 2022-08-19
      • 1970-01-01
      • 2021-03-27
      • 2011-10-21
      • 2021-12-15
      • 2020-08-20
      相关资源
      最近更新 更多