Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se
1
resposta

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

Boa tarde pessoal, no service esta dando esse erro.

obs, não quis refatorar mudando o nome para livro, mas mative tudo certinho como na aula.

segue o codigo

/* eslint-disable prettier/prettier */ 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();
}

}

1 resposta

Olá Fábio Machado, tudo bem?

Eu tive o mesmo problema, eu resolvi da seguinte forma:

Muda o retorno do método, de:

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

Para:

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

Este erro ocorre, porque quando você coloca o segundo parâmetro do .update, no caso o { where: { id: produto.id } }, o nestjs assume a sobrecarga do método .update que retorna Promise<[affectedCount: number]>, por isso o retorno do seu método tem que ser Promise<[number]>.

Observação:

Eu estou tentando descobrir o motivo do nestjs assumir a outra sobrecarga, ao invés da que estamos querendo utilizar, no caso Promise<[number, Produto[]]>, mas por hora destrava o teu projeto, e consegue seguir com os estudos.

Edit:

Olhando a documentação, sendo mais específico no arquivo model.d.ts do sequelize, eu vi que para retornar da forma que queremos: Promise<[affectedCount: number, affectedRows: M[]]>, precisamos adicionar o options returning = true, ou seja:

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

Testa ai, e dá um retorno. Se funcionar, marca como resolvido. Flw.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software