扩展外部类

时间:2016-01-28 16:09:28

标签: typescript

如何在不让编译器抱怨的情况下向现有类型对象添加其他属性?例如,如果我想在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)
    //     }
    // })

1 个答案:

答案 0 :(得分:2)

TypeScript v1.8支持模块扩充,允许您编写环境定义以扩展全局和模块范围。

早期版本不允许这样做。

declare module "mongoose" {
     FindByEmail: (target: string) => IMyUser;
}