Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

168
Visualizações
Typescript How to initialize mixed type array with class-transformer

I have class with a property member of type array, an item in the array can be of several types for example MetaViewDatalinked or MetaViewContainer, see example below

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

class MetaViewDatalinked{
     id: string;
}

I want to use class-transformer (plainToClass(MetaViewContainer, json)) to initialize the class with its properties.

if I had class without array see below, I would use @Type

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

The issue is @Type is called only once regardless of the property's type: a class or an array of classes, thus creating an array (in case of property being array) of single type.

Any ideas how to solve the issue are really appreciated.

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

I solved the issue with using @Transform decorator

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)[];
    }
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda