#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