在Mongoose中将属性定义为ObjectId时出现Typescript错误

xkrw2x1b  于 2023-04-21  发布在  Go
关注(0)|答案(1)|浏览(163)

我正在mongoose中编写接口和模式,但得到了一些类型脚本错误:

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 },
});

属性_idbar在此代码中都有键入错误:

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版本是6.5.4(目前可用的最新版本)
我也不知道为什么,这不是我第一次写mongoose模式,但是从来没有遇到过这样的问题。
我已经确认,我可以重现这个错误从干净的新项目。(意味着没有其他背景原因)

von4xj4u

von4xj4u1#

在这里,尝试像这样更改模式类型定义:

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

说明:

根据Mongoose文档,SchemaType与常规类型不同。换句话说,mongoose.ObjectId !== mongoose.Types.ObjectId。即SchemaType mongoose.Schema.Types.ObjectId是Mongoose使用的特殊定义。常规类型定义Types.ObjectId可用于创建接口,但在创建模式时必须使用SchemaType。这有点令人困惑。就像SchemaType String必须在Schema中使用,而不是在Interface中使用string,即使两者在技术上都是类型定义。希望这能有所帮助!

相关问题