Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Erro no método de alterar produto

Estou obtendo a seguinte mensagem de erro:

Type '[affectedCount: number]' is not assignable to type '[number, Produto[]]'.
  Source has 1 element(s) but target requires 2.

No trecho:

async alterar(produto: Produto): Promise<[number, Produto[]]> {
    return this.produtoModel.update(produto, {
      where: {
        id: produto.id,
      },
    });
  }

Minha classe Produto:

import { Column, DataType, Model, Table } from 'sequelize-typescript';

@Table
export class Produto extends Model<Produto> {
  @Column({
    type: DataType.STRING(60),
    allowNull: false,
  })
  codigo: string;

  @Column({
    type: DataType.STRING,
    allowNull: false,
  })
  nome: string;

  @Column({
    type: DataType.DECIMAL(10, 2),
    allowNull: false,
  })
  preco: number;
}

Meu service:

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/sequelize';
import { Produto } from './produto.model';

@Injectable()
export class ProdutosService {
  constructor(
    @InjectModel(Produto)
    private produtoModel: typeof Produto,
  ) {}

  async obterTodos(): Promise<Produto[]> {
    return this.produtoModel.findAll();
  }

  async obterUm(id: number): Promise<Produto> {
    return this.produtoModel.findByPk(id);
  }

  async criar(produto: Produto) {
    this.produtoModel.create(produto);
  }

  async alterar(produto: Produto): Promise<[number, Produto[]]> {
    return this.produtoModel.update(produto, {
      where: {
        id: produto.id,
      },
    });
  }

  async apagar(id: number) {
    const produto: Produto = await this.obterUm(id);
    produto.destroy();
  }
}
6 respostas

No código da lib ("sequelize": "^6.19.0") a definição do método o retorno me parece ser apenas o número de rows afetadas no udpate, procede?

/**
   * Update multiple instances that match the where options. The promise returns an array with one or two
   * elements. The first element is always the number of affected rows, while the second element is the actual
   * affected rows (only supported in postgres and mssql with `options.returning` true.)
   */
   public static update<M extends Model>(
    this: ModelStatic<M>,
    values: {
        [key in keyof Attributes<M>]?: Attributes<M>[key] | Fn | Col | Literal;
    },
    options: UpdateOptions<Attributes<M>>
  ): Promise<[affectedCount: number]>;

Ao desabilitar as duas linhas de update em models.ts, o erro desaparece. Porém, o TS com Sequelize não realiza a atualização das colunas da tabela no MySQL 8.0. Tentei sem sucesso separar o Model do 'sequelize-typescript' como um Model do 'sequelize' original.

Oi Emanuel, tudo bem? Isso mesmo, o erro que você tá tomando vem justamente dai, o método update retorna pra você o número de linhas afetadas no banco de dados e no retorno do seu controller, está descrito ali que ele vai retornar um Promise<[number, Produto[]]>, o que não bate com a tipagem do retorno do update, por isso o erro.

Ficou mais claro o por que do erro? Caso não, comenta aqui que eu tento te explicar de outra forma.

Abraço e bons estudos! :)

solução!

A explicação do Wanderson é bem cabível. Fiz o seguinte, para o projeto parar de reclamar do erro no código-fonte:

 async alterar(produto: Produto): Promise<[number, Produto[]]> {
        return this.produtoModel.update(produto, {
            where: {
                id: produto.id
            },"returning": true
        });
    }

Boa Demóstenes, isso realmente resolve a questão. O único comentário é que acredito que você não precise dessas aspas no returning. :)

Boa pessoal, muito obrigado