Эти типы каждой подписи несовместимы с методами mongoose с Typescript

#node.js #typescript #mongoose #methods

#node.js #typescript #mongoose #методы

Вопрос:

Я создал модель с помощью mongoose и хочу добавить метод. Предположим, у меня есть эти интерфейсы для модели (шаблонные):

 interface TestAttrs { attr1: string }
interface TestModel extends mongoose.Model<TestDoc> { build(attrs: TestAttrs): TestDoc }
interface TestDoc extends TestAttrs, mongoose.Document { testMethod(): Promise<any> }

export const testSchema = new mongoose.Schema({ attr1: {type: String} })
testSchema.statics.build = (attrs: TestAttrs) => { return new Test(attrs) }

const Test = mongoose.model<TestDoc, TestModel>('Test', testSchema)
 

Итак, теперь я хочу добавить testMethod() подобное:

 testSchema.methods.testMethod = async function(this: TestDoc): Promise<any> {
  console.log(this.attr1) // Do something with the attr1...
}
 

Но теперь я получаю сообщение об ошибке, что тип TestDoc не может быть присвоен типу документа (от mongoose. Почему это так? Я имею в виду, что TestDoc расширяет тип документа mongoose, так что разве это не было бы возможно?

Чтобы предоставить вам полное сообщение об ошибке:

 error TS2322: Type '(this: TestDoc) => Promise<any>' is not assignable to type '(this: Document<any>, ...args: any[]) => any'.
The 'this' types of each signature are incompatible.
Type 'Document<any>' is missing the following properties from type 'TestDoc': testMethod, attr1
 

Я имею в виду, конечно, что в типе документа отсутствуют эти свойства, поэтому у меня есть TestDoc. Если я задам «this» любой тип, то он будет работать так, как ожидалось, но почему Typescript выдает здесь ошибку?

Я также попытался изменить интерфейс TestDoc на TestDoc, который расширяется из Document , и добавить аргумент args. Заранее спасибо!

Комментарии:

1. testSchema = new mongoose.Schema<TestDoc>( должно это исправить. Ошибка заключается в том, что схема предназначена для Document<any> , поэтому вы не можете предоставить ей обратный вызов, требующий TestDoc