Skip to content

Commit bfc226c

Browse files
committed
types: add __v to lean() result type and ModifyResult
Re: Automattic#12959
1 parent 663f21e commit bfc226c

File tree

7 files changed

+17
-8
lines changed

7 files changed

+17
-8
lines changed

test/types/document.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ async function gh12959() {
371371

372372
const doc = await Model.findById('id').orFail();
373373
expectType<Types.ObjectId>(doc._id);
374-
expectType<number | undefined>(doc.__v);
374+
expectType<number>(doc.__v);
375375

376376
expectError(doc.subdocArray[0].__v);
377377
}

test/types/models.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -623,9 +623,9 @@ async function gh13151() {
623623

624624
const TestModel = model<ITest>('Test', TestSchema);
625625
const test = await TestModel.findOne().lean();
626-
expectType<ITest & { _id: Types.ObjectId } | null>(test);
626+
expectType<ITest & { _id: Types.ObjectId } & { __v: number } | null>(test);
627627
if (!test) return;
628-
expectType<ITest & { _id: Types.ObjectId }>(test);
628+
expectType<ITest & { _id: Types.ObjectId } & { __v: number }>(test);
629629
}
630630

631631
function gh13206() {
@@ -661,7 +661,7 @@ async function gh13705() {
661661
const schema = new Schema({ name: String });
662662
const TestModel = model('Test', schema);
663663

664-
type ExpectedLeanDoc = (mongoose.FlattenMaps<{ name?: string | null }> & { _id: mongoose.Types.ObjectId });
664+
type ExpectedLeanDoc = (mongoose.FlattenMaps<{ name?: string | null }> & { _id: mongoose.Types.ObjectId } & { __v: number });
665665

666666
const findByIdRes = await TestModel.findById('0'.repeat(24), undefined, { lean: true });
667667
expectType<ExpectedLeanDoc | null>(findByIdRes);

test/types/populate.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,6 @@ async function _11532() {
248248

249249
if (!leanResult) return;
250250
expectType<string>(leanResult.child.name);
251-
expectError(leanResult?.__v);
252251
}
253252

254253
async function gh11710() {

test/types/schema.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,3 +1714,13 @@ async function gh14451() {
17141714
myMap?: Record<string, string> | null | undefined
17151715
}>({} as TestJSON);
17161716
}
1717+
1718+
async function gh12959() {
1719+
const schema = new Schema({ name: String });
1720+
const TestModel = model('Test', schema);
1721+
1722+
const doc = await TestModel.findOne().orFail();
1723+
expectType<number>(doc.__v);
1724+
const leanDoc = await TestModel.findOne().lean().orFail();
1725+
expectType<number>(leanDoc.__v);
1726+
}

types/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ declare module 'mongoose' {
140140

141141
export type Default__v<T> = T extends { __v?: infer U }
142142
? T
143-
: T & { __v?: number };
143+
: T & { __v: number };
144144

145145
/** Helper type for getting the hydrated document type from the raw document type. The hydrated document type is what `new MyModel()` returns. */
146146
export type HydratedDocument<

types/models.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ declare module 'mongoose' {
126126
}
127127

128128
interface ModifyResult<T> {
129-
value: Require_id<T> | null;
129+
value: Default__v<Require_id<T>> | null;
130130
/** see https://www.mongodb.com/docs/manual/reference/command/findAndModify/#lasterrorobject */
131131
lastErrorObject?: {
132132
updatedExisting?: boolean;

types/query.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ declare module 'mongoose' {
217217
type QueryOpThatReturnsDocument = 'find' | 'findOne' | 'findOneAndUpdate' | 'findOneAndReplace' | 'findOneAndDelete';
218218

219219
type GetLeanResultType<RawDocType, ResultType, QueryOp> = QueryOp extends QueryOpThatReturnsDocument
220-
? (ResultType extends any[] ? Require_id<BufferToBinary<FlattenMaps<RawDocType>>>[] : Require_id<BufferToBinary<FlattenMaps<RawDocType>>>)
220+
? (ResultType extends any[] ? Default__v<Require_id<BufferToBinary<FlattenMaps<RawDocType>>>>[] : Default__v<Require_id<BufferToBinary<FlattenMaps<RawDocType>>>>)
221221
: ResultType;
222222

223223
type MergePopulatePaths<RawDocType, ResultType, QueryOp, Paths, TQueryHelpers, TInstanceMethods = Record<string, never>> = QueryOp extends QueryOpThatReturnsDocument

0 commit comments

Comments
 (0)