带有打字稿错误的猫鼬虚拟人-包含箭头功能捕获隐式类型为“ any”的“ this”的全局值

时间:2019-01-30 16:43:21

标签: typescript mongoose

我正在尝试使用带有打字稿的猫鼬虚拟眼镜。而且无法使其工作。我在代码中收到与此相关的错误。我检查了许多参考,但找不到使这项工作可用的参考。

“ [ts]包含的箭头函数捕获隐含类型为'any'的'this'的全局值。[7041]”

export const UserSchema = new Schema({
    firstName: {
        type: String
    },
    lastName: {
        type: String
    },
    roleId: {
        alias: "group",
        type: String
    }
}, {
    toJSON: {
        transform: (doc, ret, options) => {
            delete ret.id ;
            delete ret.roleId ;
            return ret ;
        },
        virtuals: true,
    }
});

UserSchema.virtual("username").get(() => {
    return this.firstName + " " + this.lastName ;
}) ;

我希望有一个新属性“ username”,它结合了“ firstName lastName”的值

替代代码,但有相同的错误-

UserSchema.virtual("username").get(function() {
    return this.firstName + " " + this.lastName ;
}) ;

2 个答案:

答案 0 :(得分:3)

定义上的箭头功能从声明上下文中捕获this。由于您直接在模块中定义函数,因此它将是全局对象。

您要常规功能。常规函数在调用对象时将this作为调用它的实际对象传递给它。

您还需要为this添加类型注释(取决于严格的设置,但是您提到您尝试了常规函数,因此可能是问题所在),或者是this: any或更特定于告诉打字稿您没有误访问this

UserSchema.virtual("username").get(function(this: { firstName: string, lastName: string}) {
  return this.firstName + " " + this.lastName ;
}) ;

答案 1 :(得分:1)

我们还可以创建一个用户界面并使其像这样:

IUser extends mongoose.Document{
firstname:string,
lastname:string
}

UserSchema.virtual("username").get(function(this:IUser) {
  return this.firstName + " " + this.lastName ;
}) ;