Skip to content

Commit f8244bd

Browse files
authored
Merge pull request #13389 from Automattic/vkarpov15/gh-13382
types: make `lean()` not clobber result type for `updateOne()`, etc.
2 parents c0b492c + cc17197 commit f8244bd

File tree

3 files changed

+237
-113
lines changed

3 files changed

+237
-113
lines changed

test/types/lean.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,3 +196,13 @@ async function gh13345_3() {
196196
const place = await PlaceModel.findOne().lean().orFail().exec();
197197
expectAssignable<Place>(place);
198198
}
199+
200+
async function gh13382() {
201+
const schema = new Schema({
202+
name: String
203+
});
204+
const Test = model('Test', schema);
205+
206+
const res = await Test.updateOne({}, { name: 'bar' }).lean();
207+
expectAssignable<{ matchedCount: number, modifiedCount: number }>(res);
208+
}

types/models.d.ts

Lines changed: 94 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -193,17 +193,24 @@ declare module 'mongoose' {
193193
collection: Collection;
194194

195195
/** Creates a `count` query: counts the number of documents that match `filter`. */
196-
count(filter?: FilterQuery<TRawDocType>): QueryWithHelpers<number, THydratedDocumentType, TQueryHelpers, TRawDocType>;
196+
count(filter?: FilterQuery<TRawDocType>): QueryWithHelpers<
197+
number,
198+
THydratedDocumentType,
199+
TQueryHelpers,
200+
TRawDocType,
201+
'count'
202+
>;
197203

198204
/** Creates a `countDocuments` query: counts the number of documents that match `filter`. */
199205
countDocuments(
200206
filter?: FilterQuery<TRawDocType>,
201207
options?: QueryOptions<TRawDocType>
202208
): QueryWithHelpers<
203-
number,
204-
THydratedDocumentType,
205-
TQueryHelpers,
206-
TRawDocType
209+
number,
210+
THydratedDocumentType,
211+
TQueryHelpers,
212+
TRawDocType,
213+
'countDocuments'
207214
>;
208215

209216
/** Creates a new document or documents */
@@ -230,18 +237,20 @@ declare module 'mongoose' {
230237
filter?: FilterQuery<TRawDocType>,
231238
options?: QueryOptions<TRawDocType>
232239
): QueryWithHelpers<
233-
mongodb.DeleteResult,
234-
THydratedDocumentType,
235-
TQueryHelpers,
236-
TRawDocType
240+
mongodb.DeleteResult,
241+
THydratedDocumentType,
242+
TQueryHelpers,
243+
TRawDocType,
244+
'deleteMany'
237245
>;
238246
deleteMany(
239247
filter: FilterQuery<TRawDocType>
240248
): QueryWithHelpers<
241-
mongodb.DeleteResult,
242-
THydratedDocumentType,
243-
TQueryHelpers,
244-
TRawDocType
249+
mongodb.DeleteResult,
250+
THydratedDocumentType,
251+
TQueryHelpers,
252+
TRawDocType,
253+
'deleteMany'
245254
>;
246255

247256
/**
@@ -253,18 +262,20 @@ declare module 'mongoose' {
253262
filter?: FilterQuery<TRawDocType>,
254263
options?: QueryOptions<TRawDocType>
255264
): QueryWithHelpers<
256-
mongodb.DeleteResult,
257-
THydratedDocumentType,
258-
TQueryHelpers,
259-
TRawDocType
265+
mongodb.DeleteResult,
266+
THydratedDocumentType,
267+
TQueryHelpers,
268+
TRawDocType,
269+
'deleteOne'
260270
>;
261271
deleteOne(
262272
filter: FilterQuery<TRawDocType>
263273
): QueryWithHelpers<
264-
mongodb.DeleteResult,
265-
THydratedDocumentType,
266-
TQueryHelpers,
267-
TRawDocType
274+
mongodb.DeleteResult,
275+
THydratedDocumentType,
276+
TQueryHelpers,
277+
TRawDocType,
278+
'deleteOne'
268279
>;
269280

270281
/**
@@ -282,25 +293,25 @@ declare module 'mongoose' {
282293
id: any,
283294
projection?: ProjectionType<TRawDocType> | null,
284295
options?: QueryOptions<TRawDocType> | null
285-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
296+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOne'>;
286297
findById<ResultDoc = THydratedDocumentType>(
287298
id: any,
288299
projection?: ProjectionType<TRawDocType> | null
289-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
300+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOne'>;
290301

291302
/** Finds one document. */
292303
findOne<ResultDoc = THydratedDocumentType>(
293304
filter?: FilterQuery<TRawDocType>,
294305
projection?: ProjectionType<TRawDocType> | null,
295306
options?: QueryOptions<TRawDocType> | null
296-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
307+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOne'>;
297308
findOne<ResultDoc = THydratedDocumentType>(
298309
filter?: FilterQuery<TRawDocType>,
299310
projection?: ProjectionType<TRawDocType> | null
300-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
311+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOne'>;
301312
findOne<ResultDoc = THydratedDocumentType>(
302313
filter?: FilterQuery<TRawDocType>
303-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
314+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOne'>;
304315

305316
/**
306317
* Shortcut for creating a new Document from existing raw data, pre-saved in the DB.
@@ -392,7 +403,7 @@ declare module 'mongoose' {
392403
watch<ResultType extends mongodb.Document = any, ChangeType extends mongodb.ChangeStreamDocument = any>(pipeline?: Array<Record<string, unknown>>, options?: mongodb.ChangeStreamOptions & { hydrate?: boolean }): mongodb.ChangeStream<ResultType, ChangeType>;
393404

394405
/** Adds a `$where` clause to this query */
395-
$where(argument: string | Function): QueryWithHelpers<Array<THydratedDocumentType>, THydratedDocumentType, TQueryHelpers, TRawDocType>;
406+
$where(argument: string | Function): QueryWithHelpers<Array<THydratedDocumentType>, THydratedDocumentType, TQueryHelpers, TRawDocType, 'find'>;
396407

397408
/** Registered discriminators for this model. */
398409
discriminators: { [name: string]: Model<any> } | undefined;
@@ -401,10 +412,22 @@ declare module 'mongoose' {
401412
translateAliases(raw: any): any;
402413

403414
/** Creates a `distinct` query: returns the distinct values of the given `field` that match `filter`. */
404-
distinct<ReturnType = any>(field: string, filter?: FilterQuery<TRawDocType>): QueryWithHelpers<Array<ReturnType>, THydratedDocumentType, TQueryHelpers, TRawDocType>;
415+
distinct<ReturnType = any>(field: string, filter?: FilterQuery<TRawDocType>): QueryWithHelpers<
416+
Array<ReturnType>,
417+
THydratedDocumentType,
418+
TQueryHelpers,
419+
TRawDocType,
420+
'distinct'
421+
>;
405422

406423
/** Creates a `estimatedDocumentCount` query: counts the number of documents in the collection. */
407-
estimatedDocumentCount(options?: QueryOptions<TRawDocType>): QueryWithHelpers<number, THydratedDocumentType, TQueryHelpers, TRawDocType>;
424+
estimatedDocumentCount(options?: QueryOptions<TRawDocType>): QueryWithHelpers<
425+
number,
426+
THydratedDocumentType,
427+
TQueryHelpers,
428+
TRawDocType,
429+
'estimatedDocumentCount'
430+
>;
408431

409432
/**
410433
* Returns a document with its `_id` if at least one document exists in the database that matches
@@ -413,124 +436,121 @@ declare module 'mongoose' {
413436
exists(
414437
filter: FilterQuery<TRawDocType>
415438
): QueryWithHelpers<
416-
{ _id: InferId<TRawDocType> } | null,
417-
THydratedDocumentType,
418-
TQueryHelpers,
419-
TRawDocType
439+
{ _id: InferId<TRawDocType> } | null,
440+
THydratedDocumentType,
441+
TQueryHelpers,
442+
TRawDocType,
443+
'findOne'
420444
>;
421445
exists(filter: FilterQuery<TRawDocType>): QueryWithHelpers<
422-
{ _id: InferId<TRawDocType> } | null,
423-
THydratedDocumentType,
424-
TQueryHelpers,
425-
TRawDocType
446+
{ _id: InferId<TRawDocType> } | null,
447+
THydratedDocumentType,
448+
TQueryHelpers,
449+
TRawDocType,
450+
'findOne'
426451
>;
427452

428453
/** Creates a `find` query: gets a list of documents that match `filter`. */
429454
find<ResultDoc = THydratedDocumentType>(
430455
filter: FilterQuery<TRawDocType>,
431456
projection?: ProjectionType<TRawDocType> | null | undefined,
432457
options?: QueryOptions<TRawDocType> | null | undefined
433-
): QueryWithHelpers<Array<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType>;
458+
): QueryWithHelpers<Array<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType, 'find'>;
434459
find<ResultDoc = THydratedDocumentType>(
435460
filter: FilterQuery<TRawDocType>,
436461
projection?: ProjectionType<TRawDocType> | null | undefined
437-
): QueryWithHelpers<Array<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType>;
462+
): QueryWithHelpers<Array<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType, 'find'>;
438463
find<ResultDoc = THydratedDocumentType>(
439464
filter: FilterQuery<TRawDocType>
440-
): QueryWithHelpers<Array<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType>;
465+
): QueryWithHelpers<Array<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType, 'find'>;
441466
find<ResultDoc = THydratedDocumentType>(
442-
): QueryWithHelpers<Array<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType>;
467+
): QueryWithHelpers<Array<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType, 'find'>;
443468

444469
/** Creates a `findByIdAndDelete` query, filtering by the given `_id`. */
445470
findByIdAndDelete<ResultDoc = THydratedDocumentType>(
446471
id?: mongodb.ObjectId | any,
447472
options?: QueryOptions<TRawDocType> | null
448-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
473+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndDelete'>;
449474

450475
/** Creates a `findByIdAndRemove` query, filtering by the given `_id`. */
451476
findByIdAndRemove<ResultDoc = THydratedDocumentType>(
452477
id?: mongodb.ObjectId | any,
453478
options?: QueryOptions<TRawDocType> | null
454-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
479+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndDelete'>;
455480

456481
/** Creates a `findOneAndUpdate` query, filtering by the given `_id`. */
457482
findByIdAndUpdate<ResultDoc = THydratedDocumentType>(
458483
id: mongodb.ObjectId | any,
459484
update: UpdateQuery<TRawDocType>,
460485
options: QueryOptions<TRawDocType> & { rawResult: true }
461-
): QueryWithHelpers<ModifyResult<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType>;
486+
): QueryWithHelpers<ModifyResult<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndUpdate'>;
462487
findByIdAndUpdate<ResultDoc = THydratedDocumentType>(
463488
id: mongodb.ObjectId | any,
464489
update: UpdateQuery<TRawDocType>,
465490
options: QueryOptions<TRawDocType> & { upsert: true } & ReturnsNewDoc
466-
): QueryWithHelpers<ResultDoc, ResultDoc, TQueryHelpers, TRawDocType>;
491+
): QueryWithHelpers<ResultDoc, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndUpdate'>;
467492
findByIdAndUpdate<ResultDoc = THydratedDocumentType>(
468493
id?: mongodb.ObjectId | any,
469494
update?: UpdateQuery<TRawDocType>,
470495
options?: QueryOptions<TRawDocType> | null
471-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
496+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndUpdate'>;
472497
findByIdAndUpdate<ResultDoc = THydratedDocumentType>(
473498
id: mongodb.ObjectId | any,
474499
update: UpdateQuery<TRawDocType>
475-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
500+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndUpdate'>;
476501

477502
/** Creates a `findOneAndDelete` query: atomically finds the given document, deletes it, and returns the document as it was before deletion. */
478503
findOneAndDelete<ResultDoc = THydratedDocumentType>(
479504
filter?: FilterQuery<TRawDocType>,
480505
options?: QueryOptions<TRawDocType> | null
481-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
506+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndDelete'>;
482507

483508
/** Creates a `findOneAndRemove` query: atomically finds the given document and deletes it. */
484509
findOneAndRemove<ResultDoc = THydratedDocumentType>(
485510
filter?: FilterQuery<TRawDocType>,
486511
options?: QueryOptions<TRawDocType> | null
487-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
512+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndRemove'>;
488513

489514
/** Creates a `findOneAndReplace` query: atomically finds the given document and replaces it with `replacement`. */
490515
findOneAndReplace<ResultDoc = THydratedDocumentType>(
491516
filter: FilterQuery<TRawDocType>,
492517
replacement: TRawDocType | AnyObject,
493518
options: QueryOptions<TRawDocType> & { rawResult: true }
494-
): QueryWithHelpers<ModifyResult<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType>;
519+
): QueryWithHelpers<ModifyResult<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndReplace'>;
495520
findOneAndReplace<ResultDoc = THydratedDocumentType>(
496521
filter: FilterQuery<TRawDocType>,
497522
replacement: TRawDocType | AnyObject,
498523
options: QueryOptions<TRawDocType> & { upsert: true } & ReturnsNewDoc
499-
): QueryWithHelpers<ResultDoc, ResultDoc, TQueryHelpers, TRawDocType>;
524+
): QueryWithHelpers<ResultDoc, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndReplace'>;
500525
findOneAndReplace<ResultDoc = THydratedDocumentType>(
501526
filter?: FilterQuery<TRawDocType>,
502527
replacement?: TRawDocType | AnyObject,
503528
options?: QueryOptions<TRawDocType> | null
504-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
529+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndReplace'>;
505530

506531
/** Creates a `findOneAndUpdate` query: atomically find the first document that matches `filter` and apply `update`. */
507532
findOneAndUpdate<ResultDoc = THydratedDocumentType>(
508533
filter: FilterQuery<TRawDocType>,
509534
update: UpdateQuery<TRawDocType>,
510535
options: QueryOptions<TRawDocType> & { rawResult: true }
511-
): QueryWithHelpers<ModifyResult<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType>;
536+
): QueryWithHelpers<ModifyResult<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndUpdate'>;
512537
findOneAndUpdate<ResultDoc = THydratedDocumentType>(
513538
filter: FilterQuery<TRawDocType>,
514539
update: UpdateQuery<TRawDocType>,
515540
options: QueryOptions<TRawDocType> & { upsert: true } & ReturnsNewDoc
516-
): QueryWithHelpers<ResultDoc, ResultDoc, TQueryHelpers, TRawDocType>;
541+
): QueryWithHelpers<ResultDoc, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndUpdate'>;
517542
findOneAndUpdate<ResultDoc = THydratedDocumentType>(
518543
filter?: FilterQuery<TRawDocType>,
519544
update?: UpdateQuery<TRawDocType>,
520545
options?: QueryOptions<TRawDocType> | null
521-
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType>;
522-
523-
geoSearch<ResultDoc = THydratedDocumentType>(
524-
filter?: FilterQuery<TRawDocType>,
525-
options?: GeoSearchOptions
526-
): QueryWithHelpers<Array<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType>;
546+
): QueryWithHelpers<ResultDoc | null, ResultDoc, TQueryHelpers, TRawDocType, 'findOneAndUpdate'>;
527547

528548
/** Creates a `replaceOne` query: finds the first document that matches `filter` and replaces it with `replacement`. */
529549
replaceOne<ResultDoc = THydratedDocumentType>(
530550
filter?: FilterQuery<TRawDocType>,
531551
replacement?: TRawDocType | AnyObject,
532552
options?: QueryOptions<TRawDocType> | null
533-
): QueryWithHelpers<UpdateWriteOpResult, ResultDoc, TQueryHelpers, TRawDocType>;
553+
): QueryWithHelpers<UpdateWriteOpResult, ResultDoc, TQueryHelpers, TRawDocType, 'replaceOne'>;
534554

535555
/** Schema the model uses. */
536556
schema: Schema<TRawDocType>;
@@ -540,31 +560,33 @@ declare module 'mongoose' {
540560
filter?: FilterQuery<TRawDocType>,
541561
update?: UpdateQuery<TRawDocType> | UpdateWithAggregationPipeline,
542562
options?: QueryOptions<TRawDocType> | null
543-
): QueryWithHelpers<UpdateWriteOpResult, ResultDoc, TQueryHelpers, TRawDocType>;
563+
): QueryWithHelpers<UpdateWriteOpResult, ResultDoc, TQueryHelpers, TRawDocType, 'updateMany'>;
544564

545565
/** Creates a `updateOne` query: updates the first document that matches `filter` with `update`. */
546566
updateOne<ResultDoc = THydratedDocumentType>(
547567
filter?: FilterQuery<TRawDocType>,
548568
update?: UpdateQuery<TRawDocType> | UpdateWithAggregationPipeline,
549569
options?: QueryOptions<TRawDocType> | null
550-
): QueryWithHelpers<UpdateWriteOpResult, ResultDoc, TQueryHelpers, TRawDocType>;
570+
): QueryWithHelpers<UpdateWriteOpResult, ResultDoc, TQueryHelpers, TRawDocType, 'updateOne'>;
551571

552572
/** Creates a Query, applies the passed conditions, and returns the Query. */
553573
where<ResultDoc = THydratedDocumentType>(
554574
path: string,
555575
val?: any
556-
): QueryWithHelpers<Array<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType>;
576+
): QueryWithHelpers<Array<ResultDoc>, ResultDoc, TQueryHelpers, TRawDocType, 'find'>;
557577
where<ResultDoc = THydratedDocumentType>(obj: object): QueryWithHelpers<
558-
Array<ResultDoc>,
559-
ResultDoc,
560-
TQueryHelpers,
561-
TRawDocType
578+
Array<ResultDoc>,
579+
ResultDoc,
580+
TQueryHelpers,
581+
TRawDocType,
582+
'find'
562583
>;
563584
where<ResultDoc = THydratedDocumentType>(): QueryWithHelpers<
564-
Array<ResultDoc>,
565-
ResultDoc,
566-
TQueryHelpers,
567-
TRawDocType
585+
Array<ResultDoc>,
586+
ResultDoc,
587+
TQueryHelpers,
588+
TRawDocType,
589+
'find'
568590
>;
569591
}
570592
}

0 commit comments

Comments
 (0)