Я помогаю с приложением машинописного текста, используя 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
?
Спасибо
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.
Надеюсь это поможет