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!
