2015-12-27 10 views
29

TypescriptでMongooseモデルを実装しようとしています。 Googleを精練してみると、ハイブリッドアプローチ(JSとTSを組み合わせる)だけが明らかになりました。 JSなしで私のむしろ素朴なアプローチでUserクラスを実装する方法は?MongooseのTypescriptの方法...?

手荷物なしでIUserModelできるようにしたい。ここで

import {IUser} from './user.ts'; 
import {Document, Schema, Model} from 'mongoose'; 

// mixing in a couple of interfaces 
interface IUserDocument extends IUser, Document {} 

// mongoose, why oh why '[String]' 
// TODO: investigate out why mongoose needs its own data types 
let userSchema: Schema = new Schema({ 
    userName : String, 
    password : String, 
    firstName : String, 
    lastName : String, 
    email  : String, 
    activated : Boolean, 
    roles  : [String] 
}); 

// interface we want to code to? 
export interface IUserModel extends Model<IUserDocument> {/* any custom methods here */} 

// stumped here 
export class User { 
    constructor() {} 
} 
+0

'User'はクラスを作成できません。これは、非同期操作であるためです。あなたが 'User.create({{}}) 'と呼ぶ必要があるので、約束を返さなければなりません。 – Louy

+0

具体的には、OPのコードで与えられているように、 'User'がクラスになれない理由を詳しく教えてください。 –

+0

代わりにhttps://github.com/typeorm/typeormをお試しください。 – Erich

答えて

47

は、私はそれを行う方法は次のとおりです。

export interface IUser extends mongoose.Document { 
    name: string; 
    somethingElse?: number; 
}; 

export const UserSchema = new mongoose.Schema({ 
    name: {type:String, required: true}, 
    somethingElse: Number, 
}); 

const User = mongoose.model<IUser>('User', UserSchema); 
export default User; 
+1

申し訳ありませんが、どのように 'mongoose'はTSで定義されていますか? –

+2

'mongoose 'から' mongoose'としてimport *;または 'mongoose = require( 'mongoose');' – Louy

+0

これは固めです、ありがとう!あなたは、あなたのアプリケーションでモデルをどのようにインポートして使用しているのか尋ねることはできますか? – Aarmora

19

別の方法として、あなたのタイプの定義とデータベースの実装をデタッチする場合。ここから

import {IUser} from './user.ts'; 
import * as mongoose from 'mongoose'; 

type UserType = IUser & mongoose.Document; 
const User = mongoose.model<UserType>('User', new mongoose.Schema({ 
    userName : String, 
    password : String, 
    /* etc */ 
})); 

インスピレーション:ちょうど別の方法で追加https://github.com/Appsilon/styleguide/wiki/mongoose-typescript-models

4

import { IUser } from './user.ts'; 
import * as mongoose from 'mongoose'; 

interface IUserModel extends IUser, mongoose.Document {} 

const User = mongoose.model<IUserModel>('User', new mongoose.Schema({ 
    userName: String, 
    password: String, 
    // ... 
})); 

そしてinterfacetypeの違いを、this answer

をお読みください。この方法では、利点を持っている、あなたMongoose静的メソッド型を追加できます:

interface IUserModel extends IUser, mongoose.Document { 
    generateJwt:() => string 
} 
+0

'generateJwt'はどこで定義しましたか? – rels

+0

@rels 'const User = mongoose.model ....パスワード:String、generateJwt:()=> {return someJwt; }}}); '基本的に' generateJwt'はモデルのもう一つのプロパティになります。 – a11smiles

+0

これをメソッドとしてこのように追加するか、メソッドプロパティに接続しますか? – user1790300

2

ご迷惑をおかけして申し訳ありませんが、これはまだ誰かにとって興味深いものです。

import { prop, Typegoose, ModelType, InstanceType } from 'typegoose'; 
import * as mongoose from 'mongoose'; 

mongoose.connect('mongodb://localhost:27017/test'); 

class User extends Typegoose { 
    @prop() 
    name?: string; 
} 

const UserModel = new User().getModelForClass(User); 

// UserModel is a regular Mongoose Model with correct types 
(async() => { 
    const u = new UserModel({ name: 'JohnDoe' }); 
    await u.save(); 
    const user = await UserModel.findOne(); 

    // prints { _id: 59218f686409d670a97e53e0, name: 'JohnDoe', __v: 0 } 
    console.log(user); 
})(); 
0

あなたがインストールしている場合あなたはとても

を行うことができます @types/mongoose

npm install --save-dev @types/mongoose 

: 私はTypegooseがモデルここ

を定義するために、よりモダンでエレガントな方法を提供して考えるには、ドキュメントの例であります
import {IUser} from './user.ts'; 
import { Document, Schema, model} from 'mongoose'; 

type UserType = IUser & mongoose.Document; 
const User = mongoose.model<UserType>('User', new mongoose.Schema({ 
    userName : String, 
    password : String, 
    /* etc */ 
})); 

PS:コピー@Hongbo Miaoの答え

関連する問題