Typescript 枚举分配给 Mongoose 枚举?

And*_*e M 2 enums mongoose mongodb node.js typescript

我们有一个基于 Typescript 的 NodeJs 项目,它使用 Mongoose。我们正在尝试找到一种合适的方法来基于 Typescript 枚举在 Mongoose 模式上定义枚举字段。我确实浏览了文档,但找不到任何值得注意的内容。

以枚举为例:

enum ETransactionType {
    Buy = 'buy',
    Sell = 'sell',
}
Run Code Online (Sandbox Code Playgroud)

和 Mongoose 模式:

const TransactionSchema = new Schema({
   user: { type: Schema.Types.ObjectId, ref: 'User' },
   product: { type: Schema.Types.ObjectId, ref: 'Product' },
   transactionType: {
      type: ETransactionType,
      default: ETransactionType.Buy
   }
});
Run Code Online (Sandbox Code Playgroud)

这是否足够,或者我们还应该从 TS 枚举中提取值,这样:

transactionType: {
   type: ETransactionType,
   default: ETransactionType.Buy,
   enum: Object.values(ETransactionType)
}
Run Code Online (Sandbox Code Playgroud)

Haf*_*fez 6

简短回答:

您需要使用第二个选项。

另外,type应该String代替枚举本身。

transactionType: {
   type: String,
   default: ETransactionType.Buy,
   // no need to use Object.values(ETransactionType) after v5.11
   enum: ETransactionType
}
Run Code Online (Sandbox Code Playgroud)

长答案:

第一个在开发时间方面是足够的,但不会enum在运行时运行验证器。这就是为什么您需要拥有该enum: Object.values(ETransactionType)部分,它不会自动添加到架构定义中。

另外,值得注意的是 mongoose 目前不支持 TypeScript,我们计划在 5.11 版本中提供官方 TypeScript 定义