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

Спасибо

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
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 для файлов?