#typescript #mongodb #mongoose #node-modules
Вопрос:
При переходе с мангуста 5.x на 6.x произошла ошибка с машинописным текстом, в частности, с UpdateQuery $inc, так как тип установлен в неопределенный. Я использую встроенные типы, а не @types/mongoose
вот пример:
export interface PrintSettings extends Document {
_id: String
currentBatch: Number
}
const PrintSettingsSchema: Schema<PrintSettings> = new Schema(
{
_id: { type: String },
currentBatch: { type: Number, default: 0, min: 0 },
},
{ timestamps: true }
)
let inc = await PrintSettingsModel.findOneAndUpdate(
{ _id: settingsId },
{ $inc: { currentBatch: 1 } }, // <------ Here is where the error occurs
{ useFindAndModify: false, new: true }
)
Ошибка, которую я получаю, заключается в следующем:
No overload matches this call.
Overload 1 of 3, '(filter: FilterQuery<PrintSettings>, update: UpdateQuery<PrintSettings>, options: QueryOptions amp; { rawResult: true; }, callback?: ((err: CallbackError, doc: any, res: any) => void) | undefined): Query<...>', gave the following error.
Type '{ currentBatch: number; }' is not assignable to type 'undefined'.
Overload 2 of 3, '(filter: FilterQuery<PrintSettings>, update: UpdateQuery<PrintSettings>, options: QueryOptions amp; { upsert: true; } amp; ReturnsNewDoc, callback?: ((err: CallbackError, doc: PrintSettings, res: any) => void) | undefined): Query<...>', gave the following error.
Type '{ currentBatch: number; }' is not assignable to type 'undefined'.
Overload 3 of 3, '(filter?: FilterQuery<PrintSettings> | undefined, update?: UpdateQuery<PrintSettings> | undefined, options?: QueryOptions | null | undefined, callback?: ((err: CallbackError, doc: PrintSettings | null, res: any) => void) | undefined): Query<...>', gave the following error.
Type '{ currentBatch: number; }' is not assignable to type 'undefined'.ts(2769)
index.d.ts(2576, 5): The expected type comes from property '$inc' which is declared here on type 'UpdateQuery<PrintSettings>'
Является ли это ошибкой типа с мангустом 6 или изменилось обновление или атомарное приращение?
Комментарии:
1. Вы используете встроенное
index.d.ts
или используете@types/mongoose
? Официальноеindex.d.ts
лицо включает в себя $inc . Можете ли вы проверить этот файл в node_modules мангуста, чтобы увидеть, присутствует ли эта строка?2. Я просто использую встроенные типы, а не @types/мангуст
3. И если вы зайдете в node_modules мангуста, вы увидите эту строку в index.d.ts?
4. да, я вижу эту строку, файл точно такой же
Ответ №1:
Проблема заключается в оболочке вашего PrintSettings
интерфейса. Типы, как ожидается PrintSettings.currentBatch
, будут одним из:
type _UpdateQuery<TSchema> = {
// ...
$inc?: OnlyFieldsOfType<TSchema, NumericTypes | undefined> amp; AnyObject;
// ...
}
type NumericTypes = number | Decimal128 | mongodb.Double | mongodb.Int32 | mongodb.Long;
Вы используете Number
вместо number
, обратите внимание на строчную букву «n». Следующие работы:
export interface PrintSettings extends Document {
_id: string;
currentBatch: number;
}
В основном, для интерфейса используются повседневные типы. Который немного отличается от типов, переданных в Schema
.
Комментарии:
1. В версии 5.x ввод текста дал бы мне ошибку, если бы я использовал число вместо числа, но я рад, что теперь это исправлено! Спасибо.