2016-11-27 4 views
0

Je construis une application en utilisant mongoose et tapuscrit. Voici un modèle simple que j'ai fait:Problème de typage de mangouste avec tapuscrit

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

Cela fonctionne bien mais j'ai besoin de lancer chaque document à tout avant d'accéder aux propriétés. Je lis un guide qui dit que je pouvais le faire:

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

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

Mon problème est que ne semble pas la mangouste type d'avoir la propriété Document. Il n'a pas non plus la propriété ObjectId. Quand je jette de la mangouste à n'importe qui et que j'utilise ces membres, ça marche très bien. Cela semble être un problème de frappe.

J'ai installé le typage mangouste comme ceci:

npm install @types/mongoose --save 

Les typages ne fonctionnent pour le schéma et ils sont bons pour toutes les autres bibliothèques que j'utilise. Quelque chose ne va pas avec ces définitions de type? Est-ce que je fais quelque chose de mal?

Répondre

1

Pour [email protected] Je pense que vous pouvez utiliser

npm install @types/mongoose --save 

au lieu de:

npm install @typings/mongoose --save 

Ceci est par exemple complet:

Database.ts

import mongoose = require('mongoose'); 

mongoose.Promise = global.Promise; 

mongoose.connect('mongodb://admin:[email protected]: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; 

J'ai aussi exemple complet de projet en utilisant tapuscrit, Node.js, mangouste & passport.js ici: https://github.com/thanhtruong0315/typescript-express-passportjs

Bonne chance.

+0

Il s'est avéré que le problème était lié au fait que j'avais affecté l'importation à une variable. Je l'ai corrigé en utilisant une approche similaire à celle que vous avez décrite dans 'Database.ts', donc votre réponse est correcte. Merci! – user5505266