Type Script와 Mongoose로 싸운 일기 #2 Genesric반을 계승하고 싶습니다.
                                            
                                                
                                                
                                                
                                                
                                                
                                                 9995 단어  mongooseTypeScript
                    
개시하다 
mongoose는plugon 형식으로 모델에 기능을 추가할 수 있습니다.
예를 들어 다음과 같은 기술을 통해useModel에 새로운findOrcreate 방법이 생길 수 있습니다.
test1.tsimport mongoose = require('mongoose');
import Schema = mongoose.Schema;
import Document = mongoose.Document;
import Model = mongoose.Model;
interface UserDocument extends Document{
  name:String;
  age:Number;
}
var userSchema:Schema = new Schema({name:String, age:Number});
//プラグインをモデルに突き刺す
userSchema.plugin(require('mongoose-findorcreate'));
var userModel:Model<UserDocument> = <Model<UserDocument>>mongoose.model('User', userSchema);
//プラグインでモデルに追加したメソッドを呼ぶ
userModel.findOrCreate({},function(){}); //The property 'findOrCreate' does not exist on value of type 'mongoose.Model<UserDocument>'
하지만 당연히 몬고우스다.d.ts가 정의한 모델에findOrcreate 방법이 없기 때문에userModel로 호출할 수 없습니다.
외부 모듈에 정의된interface는 외부에서 확장할 수 없기 때문에 이걸로 부르려면any로 모델을 수신하거나 계승된 User모델을 만들면 된다고 생각합니다.
모 창고의 모형.d.ts에서 모델 정의는 다음과 같습니다.export interface Model<T extends Document> {
    new(doc: Object): T;
    //いろいろ続く
    //…
}
허용 가능한 유형은 상속 Docoment의 유형으로 제한됩니다.그래서 계승만 하면 된다고 생각해서 다음 코드를 썼는데 컴파일이 잘못됐어요.
interface UserModel<T extends Document> Model<T extends Document> {//'{' expected. ';' expected.
  findOrCreate(opt:{}, callback:Function):void;
}
일반 클래스 상속 
방금 전의 예는 문법 해석에 실패한 것 같다.다방면의 조사를 통해 우리는 천주교류를 계승하는 데 다음과 같은 조건이 있다는 것을 발견하였다.
import mongoose = require('mongoose');
import Schema = mongoose.Schema;
import Document = mongoose.Document;
import Model = mongoose.Model;
interface UserDocument extends Document{
  name:String;
  age:Number;
}
var userSchema:Schema = new Schema({name:String, age:Number});
//プラグインをモデルに突き刺す
userSchema.plugin(require('mongoose-findorcreate'));
var userModel:Model<UserDocument> = <Model<UserDocument>>mongoose.model('User', userSchema);
//プラグインでモデルに追加したメソッドを呼ぶ
userModel.findOrCreate({},function(){}); //The property 'findOrCreate' does not exist on value of type 'mongoose.Model<UserDocument>'
export interface Model<T extends Document> {
    new(doc: Object): T;
    //いろいろ続く
    //…
}
interface UserModel<T extends Document> Model<T extends Document> {//'{' expected. ';' expected.
  findOrCreate(opt:{}, callback:Function):void;
}
방금 전의 예는 문법 해석에 실패한 것 같다.다방면의 조사를 통해 우리는 천주교류를 계승하는 데 다음과 같은 조건이 있다는 것을 발견하였다.
interface B<T> extends A<T>처럼 T가 어떤 것도 계승하지 않았을 때interface B<String> extends A<String>와 같이 정형시interface B extends A<String>처럼 계승측의 유형을 생략일단 해결하다 
이번 예는 UserModel이 Docoment를 계승하는 UserDocument만 받아들이기 위해 인터페이스를 정의한 후 다음과 같은 코드가 되었다는 것이다.
test2.ts//importやUserDocumentの宣言はtest1.tsと同じなので省略
interface UserModel extends Model<UserDocument> {
  findOrCreate(opt:{}, callback:Function):void;
}
mongoose.connect('localhost');
var userSchema:Schema = new Schema({name:String, age:Number});
userSchema.plugin(require('mongoose-findorcreate'));
var userModel:UserModel = <UserModel>mongoose.model('User', userSchema);
//モデルを新たに作る
userModel.findOrCreate({name: 'ORZNGO', age:17}, (err:any, doc:UserDocument, created:Boolean):void => {
  console.log(created);//true(作られた)
  userModel.findOrCreate({name: 'ORZNGO', age:17}, (err:any, doc:UserDocument, created:Boolean):void => {
    console.log(created);//false(既にあるので作られない)
  });
});
편역과 함께 했습니다.나는 UserModel이 다양한 유형의 방법을 받아들일 수 있을 것이라고 생각하지만, 나는 이미 목적을 달성했다.
문서가 이미 존재할 때 만들지 않는 방법의 행위도 확인할 수 있다.
메우고 잘 나왔어.잘 됐다.
 
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(Type Script와 Mongoose로 싸운 일기 #2 Genesric반을 계승하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/orzngo/items/18733885162edc6807e1
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
//importやUserDocumentの宣言はtest1.tsと同じなので省略
interface UserModel extends Model<UserDocument> {
  findOrCreate(opt:{}, callback:Function):void;
}
mongoose.connect('localhost');
var userSchema:Schema = new Schema({name:String, age:Number});
userSchema.plugin(require('mongoose-findorcreate'));
var userModel:UserModel = <UserModel>mongoose.model('User', userSchema);
//モデルを新たに作る
userModel.findOrCreate({name: 'ORZNGO', age:17}, (err:any, doc:UserDocument, created:Boolean):void => {
  console.log(created);//true(作られた)
  userModel.findOrCreate({name: 'ORZNGO', age:17}, (err:any, doc:UserDocument, created:Boolean):void => {
    console.log(created);//false(既にあるので作られない)
  });
});
Reference
이 문제에 관하여(Type Script와 Mongoose로 싸운 일기 #2 Genesric반을 계승하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/orzngo/items/18733885162edc6807e1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)