Ввод функций проверки 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?

Спасибо

В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
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.

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

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

Похожие вопросы

Передача vscode во внешние функции
Firebase: Почему мой код использует только первый документ в моей коллекции?
Реагировать на ошибку машинописного текста - элемент неявно имеет любой тип, потому что выражение строки типа не может использоваться для индексирования типа {}
Как получить доступ к вложенным необязательным индексам из интерфейса
Почему машинописный текст не может контекстуально вывести эти типы промежуточного программного обеспечения
Передать конструктор класса как функцию в другом классе
React & clsx: добавьте имя класса, если текущий элемент в сопоставленном массиве является первым из нескольких элементов
Свойство «MathFun» отсутствует в типе «(x?: число, y?: число) => число», но требуется в типе «Func».
Получение строки типа не может быть назначено строке типа для компонента TS в сборнике рассказов
Как ввести useState для файлов?