lỗi mongoose virtuals với typescript - Hàm mũi tên chứa chiếm giá trị toàn cục của 'this' mà ngầm định có kiểu 'any'
Tôi đang cố gắng sử dụng mongoose virtuals với typescript. Và không thể làm nó hoạt động. Tôi nhận được lỗi liên quan đến việc sử dụng this trong mã. Tôi đã kiểm tra nhiều tài liệu tham khảo nhưng không thể tìm thấy tài liệu nào để làm cho nó hoạt động.
"[ts] Hàm mũi tên chứa đựng nắm giữ giá trị toàn cục của 'this' mà ngầm định có kiểu 'any'. [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 ;
}) ;
Tôi đang mong đợi một thuộc tính mới "username" kết hợp các giá trị của "firstName lastName"
Mã thay thế nhưng cùng lỗi -
UserSchema.virtual("username").get(function() {
return this.firstName + " " + this.lastName ;
}) ;
Câu trả lời #1
Hàm mũi tên theo định nghĩa sẽ nắm bắt this từ ngữ cảnh khai báo. Vì bạn đang định nghĩa hàm trực tiếp trong module nên đây sẽ là đối tượng toàn cục.
Bạn muốn một hàm thông thường. Một hàm thông thường, khi được gọi trên một đối tượng sẽ có this được truyền vào nó như là đối tượng thực tế mà nó được gọi trên đó.
Bạn cũng cần thêm chú thích kiểu cho this (tùy thuộc vào cài đặt nghiêm ngặt của bạn nhưng bạn đề cập rằng bạn đã thử một hàm thông thường nên đây có thể là vấn đề), hoặc this: any hoặc một thứ gì đó cụ thể hơn để cho TypeScript biết rằng bạn không truy cập nhầm this
UserSchema.virtual("username").get(function(this: { firstName: string, lastName: string}) {
return this.firstName + " " + this.lastName ;
}) ;
Câu trả lời #2
chúng ta cũng có thể tạo một giao diện người dùng và làm nó như thế này:
IUser extends mongoose.Document{
firstname:string,
lastname:string
}
UserSchema.virtual("username").get(function(this:IUser) {
return this.firstName + " " + this.lastName ;
}) ;
