Ввод функций проверки Mongoose

Я помогаю с приложением машинописного текста, используя MongoDB для сохранения данных. Одна из вещей, которую мы пытаемся сделать, — это избавиться от использования any.

Приведенный ниже код используется для определения части схемы мангуста:

priceMax: {
  max: 10000000,
  min: 0,
  required: function (this: FeePricing & Document) {
    return this.priceMin === undefined;
  },
  type: Number,
  validate: [
    {
      message: 'Max price cannot be lower than min price',
      validator: function (v: number) {
        if ((this as any).priceMax === null || (this as any).priceMax === undefined) return true;
        return (this as any).priceMin ? v >= (this as any).priceMin : v >= 0;
      },
    },
    {
      message: 'Max price cannot be higher than 50000 for this feeType',
      validator: function (v: number) {
        return !(!feeTypesWithoutMaxLimit.includes((this as any).feeType) && v > 50000);
      },
    },
  ],
},
priceMin: {
  max: 10000000,
  min: 0,
  required: function () {
    return (this as any).priceMax === undefined;
  },
  type: Number,
  validate: {
    message: 'priceMin cannot be higher than priceMax',
    validator: function (v: number) {
      return (this as any).priceMax ? v <= (this as any).priceMax : v >= 0;
    },
  },
},
updatedAt: { type: Date },
updatedBy: { type: String },

Я, вроде, понимаю, что делают функции, но вот типы меня смущают.

Как я мог избавиться от this as any? Почему бы просто не использовать FeePricing для типа, например (this as FeePricing)? FeePricing похоже, что это просто еще один тип из моего приложения [, в котором есть priceMin и priceMax] в сочетании с интерфейсом Document. Как здесь помогает Document от ReactJS? Зачем это нужно? Является ли this в validate определенным выше типом FeePricing & Document?

Спасибо

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
14
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

this — это контекст вашей конфигурации проверки. Поскольку TypeScript не может вывести свой тип (из-за того, что его можно изменить), я бы рекомендовал создать свой собственный тип, например FeePricing. Я не слишком уверен, какие свойства содержит ваш текущий FeePricing, поскольку он не был включен в пример, но я бы сделал это следующим образом:

interface FeePricing {
  priceMin?: mongoose.Schema.Types.Number | null,
  priceMax?: mongoose.Schema.Types.Number | null,
  feeType?: mongoose.Schema.Types.Number | null,
}

Затем вы можете использовать его следующим образом:

(this as FeePricing).priceMax

Причина, по которой свойства являются необязательными, а также нулевыми, заключается в том, что я вижу, что часть вашей логики проверяет, являются ли они undefined или null, поэтому эти типы будут отражать, что они могут не существовать во время выполнения, и помогут вам правильно проверить. Кроме того, если тип FeePricing используется для чего-то другого, вы, конечно, можете изменить имя этого типа на что-то другое.

Чтобы ответить на ваш вопрос о ReactJs Document, он не помогает определить тип конфигурации мангуста и действительно может быть удален.

насколько я понимаю, в Mongoose схема используется для определения документа, который хранится в MongoDB. Если я прав, вы можете просто создать модель/интерфейс Feepricing и использовать ее в качестве типа.

export interface FeePricing {
  priceMax: number;
  priceMin: number;
}

this — это объект FreePricing.

Надеюсь это поможет

Другие вопросы по теме