Typescript-fel när man definierar egenskap som ObjectId i Mongoose
Jag skriver interface och schema i mongoose, men fick ett typescript-fel:
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 },
});
både egenskapen _id och bar har TypeScript-fel i denna kod:
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
Mongoose-versionen är 6.5.4 (vilket för närvarande är den senaste tillgängliga versionen)
Jag har ingen aning varför. Det är inte första gången för mig att skriva mongoose-schema, men har inte haft några problem som detta.
Jag har bekräftat att jag kan återskapa detta fel från ett helt nytt projekt. (betyder att det inte finns någon annan bakgrundorsak)
Svar #1
Här, försök ändra dina schematypdefinitioner så här:
const FooSchema = new Schema<Foo>({
_id: { type: mongoose.Schema.Types.ObjectId },
bar: { type: mongoose.Schema.Types.ObjectId },
});
Förklaring:
Enligt Mongoose-dokumentationen är en SchemaType annorlunda än en vanlig typ. Med andra ord, mongoose.ObjectId !== mongoose.Types.ObjectId. Det vill säga, SchemaType mongoose.Schema.Types.ObjectId är en speciell definition som används av Mongoose. Den vanliga typdefinitionen Types.ObjectId kan användas för att skapa Interfaces, men SchemaType måste användas när man skapar ett schema. Det är lite förvirrande, ja. Precis som SchemaType String måste användas i ett schema istället för string i ett Interface även om båda tekniskt sett är typdefinitioner. Hoppas detta hjälper!
