Схема Mongoose с Typescript - ошибки проектирования - PullRequest
0 голосов
/ 23 октября 2018

У меня две проблемы при определении схемы с помощью mongoose и typcript.Вот мой код:

import { Document, Schema, Model, model} from "mongoose";

export interface IApplication {
    id: number;
    name: string;
    virtualProperty: string;
}

interface IApplicationModel extends Document, IApplication {} //Problem 1

let ApplicationSchema: Schema = new Schema({
    id: { type: Number, required: true, index: true, unique: true},
    name: { type: String, required: true, trim: true },
});
ApplicationSchema.virtual('virtualProperty').get(function () {
    return `${this.id}-${this.name}/`; // Problem 2
});
export const IApplication: Model<IApplicationModel> = model<IApplicationModel>("Application", ApplicationSchema);

Прежде всего:

  • Задача 1 в этой строке

interface IApplicationModel extends Document, IApplication {}

Typescript говорит мне, что:

error TS2320: Interface 'IApplicationModel' cannot simultaneously extend types 'Document' and 'IApplication'. Named property 'id' of types 'Document' and 'IApplication' are not identical.

Итак, как изменить определение свойства id?

  • Проблема 2 находится во внутреннейфункция (получатель для virtualProperty):

    return `$ {this.id} - $ {this.name} /;// Задача 2

Ошибка:

error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation.

Как определить тип this?

1 Ответ

0 голосов
/ 24 октября 2018

Проблема № 1: Поскольку IApplicationModel расширяет интерфейсы Document и IApplication, которые объявляют свойство id с различными типами (any и number соответственно), TypeScript не знает, является ли idсвойство IApplicationModel должно иметь тип any или number.Это можно исправить, повторно выделив свойство id в IApplicationModel с нужным типом.(Почему вы объявляете отдельный IApplication интерфейс, а не просто IApplicationModel, который расширяет Document со всеми вашими свойствами?)

Проблема №2: Просто объявите специальный параметр this для функциикак показано ниже.

import { Document, Schema, Model, model} from "mongoose";

export interface IApplication {
    id: number;
    name: string;
    virtualProperty: string;
}

interface IApplicationModel extends Document, IApplication {
    id: number;
}

let ApplicationSchema: Schema = new Schema({
    id: { type: Number, required: true, index: true, unique: true},
    name: { type: String, required: true, trim: true },
});
ApplicationSchema.virtual('virtualProperty').get(function (this: IApplicationModel) {
    return `${this.id}-${this.name}/`;
});
export const IApplication: Model<IApplicationModel> = model<IApplicationModel>("Application", ApplicationSchema);
...