Type Script와 Mongoose로 싸운 일기 #2 Genesric반을 계승하고 싶습니다.

9995 단어 mongooseTypeScript

개시하다


mongoose는plugon 형식으로 모델에 기능을 추가할 수 있습니다.
예를 들어 다음과 같은 기술을 통해useModel에 새로운findOrcreate 방법이 생길 수 있습니다.
test1.ts
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>'

하지만 당연히 몬고우스다.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;
}

일반 클래스 상속


방금 전의 예는 문법 해석에 실패한 것 같다.다방면의 조사를 통해 우리는 천주교류를 계승하는 데 다음과 같은 조건이 있다는 것을 발견하였다.
  • interface B<T> extends A<T>처럼 T가 어떤 것도 계승하지 않았을 때
  • interface B<String> extends A<String>와 같이 정형시
  • 이 경우 interface B extends A<String>처럼 계승측의 유형을 생략
  • T가 뭔가 물려받으면 컴파일링이 잘못될 것 같아.나는 이유를 모른다.

    일단 해결하다


    이번 예는 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이 다양한 유형의 방법을 받아들일 수 있을 것이라고 생각하지만, 나는 이미 목적을 달성했다.
    문서가 이미 존재할 때 만들지 않는 방법의 행위도 확인할 수 있다.
    메우고 잘 나왔어.잘 됐다.

    좋은 웹페이지 즐겨찾기