如何在不让编译器抱怨的情况下向现有类型对象添加其他属性?例如,如果我想在Mongoose模型的实例上添加额外的FindByEmail方法。下面的解决方案是我能找到满足编译器的唯一方法。是否有更惯用的方法来实现这一目标?
export var userSchema = new Schema({
name: String, email: String
});
export interface IUser extends Document {
name: string; email: string;
}
interface IMyUser extends Model<IUser> {
FindByEmail(target: string): mongoose.Query<IUser>;
}
interface IMyUser extends Model<IUser> {
FindByEmail(target: string): Query<IUser>;
}
function Create(user: Model<IUser>) {
(<IMyUser>user).FindByEmail = (target: string) => {
return user.findOne({ email: target })
}
return <IMyUser>this.user;
}
export var User = Create(_db.model<IUser>("User", userSchema));
User.create({name:"canIbeFound", email:"a@b.com"});
//User.FindByEmail("a@b.com").exec().then((res) => {
// if (res) {
// console.log(res.email + " was found belonging to " + res.name)
// }
// })
答案 0 :(得分:2)
TypeScript v1.8支持模块扩充,允许您编写环境定义以扩展全局和模块范围。
早期版本不允许这样做。
declare module "mongoose" {
FindByEmail: (target: string) => IMyUser;
}