Pesquisa de site

Erro do Typescript ao definir propriedade como ObjectId no Mongoose


Estou escrevendo interface e schema no mongoose, mas recebi alguns erros de TypeScript:

import { Schema, Types } from 'mongoose';

interface Foo {
  _id: Types.ObjectId,
  bar: Types.ObjectId,
}

const FooSchema = new Schema<Foo>({
  _id: { type: Types.ObjectId },
  bar: { type: Types.ObjectId },
});

tanto a propriedade _id quanto bar têm erro no TypeScript neste código:

Type '{ type: typeof Types.ObjectId; }' is not assignable to type 'SchemaDefinitionProperty | undefined'.
  Types of property 'type' are incompatible.
    Type 'typeof ObjectId' is not assignable to type 'typeof Mixed | ObjectIdSchemaDefinition | undefined'.
      Type 'typeof ObjectId' is missing the following properties from type 'typeof Mixed': schemaName, cast, checkRequired, set, get

A versão do mongoose é 6.5.4 (que atualmente é a versão mais recente disponível)

Não faço ideia do porquê. Não é a primeira vez que escrevo um schema do mongoose, mas nunca tive problemas como este.

Confirmei que posso reproduzir este erro a partir de um projeto novo e limpo. (isso significa que não há outra causa de fundo)

Resposta #1

Aqui, tente mudar suas definições de tipo de esquema assim:

const FooSchema = new Schema<Foo>({
  _id: { type: mongoose.Schema.Types.ObjectId },
  bar: { type: mongoose.Schema.Types.ObjectId },
});

Explicação:

De acordo com a documentação do Mongoose, um SchemaType é diferente de um tipo comum. Em outras palavras, mongoose.ObjectId !== mongoose.Types.ObjectId. Ou seja, o SchemaType mongoose.Schema.Types.ObjectId é uma definição especial usada pelo Mongoose. A definição de tipo regular Types.ObjectId pode ser usada para criar Interfaces, mas o SchemaType deve ser usado ao criar um schema. É um pouco confuso, sim. Assim como o SchemaType String deve ser usado em um Schema ao invés de string em uma Interface, mesmo que ambos sejam tecnicamente definições de tipo. Espero que isso ajude!

Artigos relacionados