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.)
//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.)