【问题标题】:Mongoose typing issue with typescript打字稿的猫鼬打字问题
【发布时间】:2017-04-11 11:57:26
【问题描述】:

我正在使用 mongoose 和 typescript 构建一个应用程序。这是我制作的一个简单模型:

import * as callbackMongoose from 'mongoose';
var mongoose = callbackMongoose;
mongoose.Promise = global.Promise;
const Schema = mongoose.Schema;

var userSchema = new Schema({
    username: String,
    email: String,
    hash: String
});

export default mongoose.model('User', userSchema);

效果很好,但我需要在访问属性之前将每个文档转换为任何文档。我读了一个指南,说我可以这样做:

interface IUser extends mongoose.Document {
  username: String;
  email: String;
  hash: String;
}

export default mongoose.model<IUser>('User', userSchema);

我的问题是猫鼬类型似乎没有属性Document。它也没有属性ObjectId。当我将猫鼬投射到任何成员并使用这些成员时,它工作得很好。这似乎是一个打字问题。

我是这样安装猫鼬打字的:

npm install @types/mongoose --save

这些类型确实适用于 Schema,并且它们适用于我使用的所有其他库。这些类型定义有问题吗?我做错了吗?

【问题讨论】:

    标签: node.js typescript mongoose definitelytyped


    【解决方案1】:

    对于 TypeScript@2.0 我想你可以使用

    npm install @types/mongoose --save
    

    代替:

    npm install @typings/mongoose --save
    

    这是完整的例子:

    Database.ts

    import mongoose = require('mongoose');
    
    mongoose.Promise = global.Promise;
    
    mongoose.connect('mongodb://admin:123456@ds149437.mlab.com:49437/samples');
    
    export { mongoose };
    

    UserData.ts

    import { mongoose } from './../../Services/Database';
    
    export interface UserData {
        is_temporary: boolean;
        is_verified: boolean;
        status: boolean;
        username: string;
    }
    
    export interface IUserData extends UserData, mongoose.Document, mongoose.PassportLocalDocument { };
    

    UserModel.ts

    import { IUserData } from './UserData';
    import { mongoose } from './../../Services/Database';
    
    import * as passportLocalMongoose from 'passport-local-mongoose';
    import Schema = mongoose.Schema;
    
    
    const UserSchema = new Schema({
      username: { type: String, required: true },
      password: String,
      status: { type: Boolean, required: true },
      is_verified: { type: Boolean, required: true },
      is_temporary: { type: Boolean, required: true }
    });
    
    UserSchema.plugin(passportLocalMongoose);
    
    var UserModel;
    try {
      // Throws an error if 'Name' hasn't been registered
      UserModel = mongoose.model('User')
    } catch (e) {
      UserModel = mongoose.model<IUserData>('User', UserSchema);
    }
    
    export = UserModel;
    

    我还在这里使用 typescript、node.js、mongoose 和 passport.js 完成项目示例:https://github.com/thanhtruong0315/typescript-express-passportjs

    祝你好运。

    【讨论】:

    • 事实证明问题在于我将导入分配给了一个变量。我使用类似于您在Database.ts 中描述的方法修复了它,因此您的答案是正确的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 2016-02-05
    • 2020-05-11
    • 2016-04-01
    • 2021-01-05
    • 2017-01-20
    • 1970-01-01
    • 2016-06-14
    相关资源
    最近更新 更多