Node.js 使用typescript的Mongoose键入问题

Node.js 使用typescript的Mongoose键入问题,node.js,typescript,mongoose,definitelytyped,Node.js,Typescript,Mongoose,Definitelytyped,我正在使用mongoose和typescript构建一个应用程序。以下是我制作的一个简单模型: import * as callbackMongoose from 'mongoose'; var mongoose = callbackMongoose; mongoose.Promise = global.Promise; const Schema = mongoose.Schema; var userSchema = new Schema({ username: String,

我正在使用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);
这些类型确实适用于Schema,它们也适用于我使用的所有其他库。这些类型定义有问题吗?我做错什么了吗?

TypeScript@2.0 我想你可以用

npm install @types/mongoose --save
而不是:

npm install @typings/mongoose --save
这是一个完整的例子:

数据库.ts

import mongoose = require('mongoose');

mongoose.Promise = global.Promise;

mongoose.connect('mongodb://admin:123456@ds149437.mlab.com:49437/samples');

export { mongoose };
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 { };
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;
UserData.ts

import mongoose = require('mongoose');

mongoose.Promise = global.Promise;

mongoose.connect('mongodb://admin:123456@ds149437.mlab.com:49437/samples');

export { mongoose };
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 { };
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;
UserModel.ts

import mongoose = require('mongoose');

mongoose.Promise = global.Promise;

mongoose.connect('mongodb://admin:123456@ds149437.mlab.com:49437/samples');

export { mongoose };
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 { };
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;
从“/UserData”导入{IUserData};
从“/../../Services/Database”导入{mongoose};
从“passport local mongoose”导入*作为passport local mongoose;
导入Schema=mongoose.Schema;
const UserSchema=新模式({
用户名:{type:String,必需:true},
密码:String,
状态:{type:Boolean,必需:true},
已验证:{type:Boolean,必需:true},
是临时的:{type:Boolean,必需:true}
});
插件(passportLocalMongoose);
var用户模型;
试一试{
//如果尚未注册“Name”,则引发错误
UserModel=mongoose.model('User')
}捕获(e){
UserModel=mongoose.model('User',UserSchema);
}
导出=用户模型;
我还在这里使用typescript、node.js、mongoose和passport.js提供了完整的项目示例:


祝你好运。

原来问题在于我将导入赋值给了一个变量。我使用了一种类似于您在
Database.ts
中描述的方法来修复它,因此您的答案是正确的。谢谢非常感谢你!