首页 > 解决方案 > 在 Mongoose Schema 中使用雪花作为类型

问题描述

背景:Discord.js 使用雪花识别许多项目(消息、成员、行会等)。在我的场景中,我使用雪花作为公会内部成员的唯一标识符以及我的 MongoDB 数据库中的主键。

问题:我想在我的 Mongoose 模式中使用 Discord 的 Snowflake 作为类型:

import { Snowflake } from 'discord.js';
import { Schema } from 'mongoose';

const MembershipSchema: Schema = new Schema({
    discordID: { type: Snowflake, required: true, unique: true },
});

但是,我从 VSCode 的 Intellisense 收到一个错误,告诉我'Snowflake' only refers to a type, but is being used as a value here.我很困惑,因为我对 Discord.js 文档的解释是这Snowflake是一种类型(基本上只是 a string)。

我绝对可以简单地使用string,但我想知道是否有任何方法可以使其工作类似于我上面显示的方式。我希望它非常明确,discordID字段内的值必须是 a Snowflake,而不是任何旧字符串。

标签: javascripttypescriptmongodbmongoosediscord.js

解决方案


我发现执行类型的最合适方法部分包括@MrMythical 和@Toasty 提供的答案。但是,他们的答案不完整,不应该完全遵循以实现我的目标。

本质上,经过几个小时的研究,我发现的解决方案是在模型创建时简单地添加一个打字界面。至少在 VSCode 中,Intellisense 会认识到这一点,并将根据接口中的内容强制定义模式参数的类型。

一个例子如下所示:

MembershipModel.ts

import { model, Schema } from 'mongoose';
import Membership from '../interfaces/MembershipStorage';

const MembershipSchema: Schema = new Schema(
    {
        discordID: { type: String, required: true, unique: true },
        ieeeID: { type: String, required: true, unique: true },
    },
    {
        collection: 'members',
        minimize: false,
        strictQuery: true,
    }
);

export default model<Membership>('Member', MembershipSchema);

MembershipStorage.ts

import { Snowflake } from 'discord.js';

export default interface Membership {
    discordID: Snowflake;
    ieeeID: string;
}

推荐阅读