3
respostas

Propriedade não encontrada em tipos genericos

Olá, bom dia! Estou com um problema de não encontrar propriedades em tipos genéricos

Tenho uma classe genérica com o construtor abaixo.

    constructor(protected _model: Model<InstanceType<T>, {}>) {
        super(_model)
    }

Meu model tem métodos para interagir com um banco de dados, como por exemplo buscar um registro pelo ID. Até ai tudo bem, quando chamo a classe e passo o tipo para ela e ela faz as interações com o banco normal.

let recordFound = await this._model.findById(id);

O problema ocorre quando eu preciso acessar alguma propriedade do objeto retornado pelo método findById.

let email = recordFound.email

isso me retorna o erro "Property 'email' does not exist on type InstanceType"

Acredito que por ser do tipo genério o typescript não entende que tem esta propriedade, mas como eu tenho certeza que tem esta propriedade, como eu faço para ele não dar este erro?

3 respostas

Fala aí Murilo, tudo bem? Realmente, o problema é que o TypeScript não sabe que seu elemento possuí a propriedade email, isso porque o retorno do Mongoose será um Document (caso esteja usando Mongoose).

Você vai precisar tipar o retorno ou pedir para o Mongoose devolver apenas o objeto cru, sem ser um Document:

let recordFound = await this._model.findById(id).lean();

Veja que adicionei a função .lean, ela devolve um objeto e não um Document.

Espero ter ajudado.

Legal, não sabia dessa função .lean Como eu faria para tipar o retorno como você mencionou? Tem como sobrescrever a tipagem padrão retornará pelo mongoose, que no caso é um DocumentQuery?

Cria um Interface e tipa o recordFound:

let recordFound: MyType = await this._model.findById(id).lean();

Onde MyType será sua Interface.

Se caso der problema, você pode tentar fazer um cast:

let recordFound: MyType = await this._model.findById(id).lean() as MyType;

Espero ter ajudado.