Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
This PR fixes a TypeScript type inference issue where using both timestamps: true and virtuals in schema options causes toObject() return types to lose precision, degrading typed fields to {} | undefined.
Changes:
- Removed explicit
thisparameter fromTVirtualPathFNtype to prevent inference contamination when combined with timestamps - Added
ThisTypetoSchemaOptionsVirtualsPropertyTypeto maintainthiscontext in virtual getters/setters - Added comprehensive type test (
gh15965) validating correct type inference fortoObject()with timestamps + virtuals
Reviewed changes
Copilot reviewed 1 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| types/virtuals.d.ts | Refactored virtual path function type to use ThisType instead of explicit this parameter, fixing type inference issues with timestamps |
| test/types/document.test.ts | Added regression test for toObject() type inference with both timestamps and virtuals enabled |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
vkarpov15
approved these changes
Jan 23, 2026
Collaborator
vkarpov15
left a comment
There was a problem hiding this comment.
Neat, I didn't know about ThisType<> in TypeScript - very helpful!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #15965
When a schema uses both
timestamps: trueandvirtuals, thetoObject()return type loses precision. Fields that should be typed (string, subdocs, etc.) degrade to{}|undefined. This doesn’t happen if eithertimestampsorvirtualsis removed.The
virtualsoption inSchemaOptionswas typed via a virtual getter/setter signature that used an explicitthisparameter. That explicitthisinteracts poorly with inference oncetimestampsextends the document type. The net effect is that thevirtualsoption object gets inferred as the definition object instead of its value shape, which then contaminatesSchemaOptionsand collapses thetoObject()return type.Fix
thistyping onto thevirtualsoptions object usingThisType.thisparameter from the virtual getter/setter type, so inference stays stable.tsdregression test that matches the issue repro and asserts correcttoObject()field types withtimestamps+virtuals.I started this on 9.2 because #15864 already reworked relevant types, keeping the fix on 9.2 avoids having to solve it again for 9.2.