Skip to content

Commit

Permalink
fix(types): make HydratedDocument take overrides as a generic param r…
Browse files Browse the repository at this point in the history
…ather than separate TVirtuals and TInstanceMethods

Re: #11615
  • Loading branch information
vkarpov15 committed Jan 18, 2023
1 parent bfe57c4 commit 55375bf
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 82 deletions.
2 changes: 1 addition & 1 deletion test/types/create.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Schema, model, Types, CallbackError } from 'mongoose';
import { expectError, expectType } from 'tsd';

const schema: Schema = new Schema({ name: { type: 'String' } });
const schema = new Schema({ name: { type: 'String' } });

interface ITest {
_id?: Types.ObjectId;
Expand Down
2 changes: 1 addition & 1 deletion test/types/document.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ async function gh11960() {
nestedArray: HydratedArraySubdocument<Nested>[]
}

type ParentDocument = HydratedDocument<Parent> & ParentDocumentOverrides;
type ParentDocument = HydratedDocument<Parent, ParentDocumentOverrides>;

const NestedSchema = new Schema({
dummy: { type: String }
Expand Down
2 changes: 1 addition & 1 deletion test/types/plugin.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ interface TestInstanceMethods {
interface TestStaticMethods {
findSomething(this: TestModel): Promise<TestDocument>;
}
type TestDocument = HydratedDocument<Test, TestInstanceMethods, TestVirtuals>;
type TestDocument = HydratedDocument<Test, TestVirtuals & TestInstanceMethods>;
type TestQuery = Query<any, TestDocument, TestQueryHelpers> & TestQueryHelpers;
interface TestQueryHelpers {
whereSomething(this: TestQuery): this
Expand Down
4 changes: 2 additions & 2 deletions test/types/populate.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,13 +143,13 @@ function gh11321(): void {
});

parentSchema.virtual('test', {
localField: (doc: HydratedDocument<Parent, {}>): string => {
localField: (doc: HydratedDocument<Parent>): string => {
if (typeof doc.name === 'string') {
return doc.name;
}
return 'foo';
},
foreignField: (doc: HydratedDocument<Parent, {}>): string => {
foreignField: (doc: HydratedDocument<Parent>): string => {
if (typeof doc.name === 'string') {
return doc.name;
}
Expand Down
9 changes: 4 additions & 5 deletions types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,13 +129,12 @@ declare module 'mongoose' {
? IfAny<U, T & { _id: Types.ObjectId }, T & Required<{ _id: U }>>
: T & { _id: Types.ObjectId };

export type HydratedDocument<DocType, TMethodsAndOverrides = {}, TVirtuals = {}> = (Document<unknown, any, DocType> & Require_id<DocType> & TVirtuals & TMethodsAndOverrides);
export type HydratedSingleSubdocument<DocType, TMethodsAndOverrides = {}, TVirtuals = {}> = (Types.Subdocument<unknown> & Require_id<DocType> & TVirtuals & TMethodsAndOverrides);
export type HydratedArraySubdocument<DocType, TMethodsAndOverrides = {}, TVirtuals = {}> = (Types.ArraySubdocument<unknown> & Require_id<DocType> & TVirtuals & TMethodsAndOverrides);
export type HydratedDocument<DocType, TOverrides = {}> = (Document<unknown, any, DocType> & Require_id<DocType> & TOverrides);
export type HydratedSingleSubdocument<DocType, TOverrides = {}> = (Types.Subdocument<unknown> & Require_id<DocType> & TOverrides);
export type HydratedArraySubdocument<DocType, TOverrides = {}> = (Types.ArraySubdocument<unknown> & Require_id<DocType> & TOverrides);

export type HydratedDocumentFromSchema<TSchema extends Schema> = HydratedDocument<
InferSchemaType<TSchema>,
ObtainSchemaGeneric<TSchema, 'TQueryHelpers'>,
ObtainSchemaGeneric<TSchema, 'TInstanceMethods'>
>;

Expand Down Expand Up @@ -355,7 +354,7 @@ declare module 'mongoose' {
statics: { [F in keyof TStaticMethods]: TStaticMethods[F] } & { [name: string]: (this: M, ...args: any[]) => any };

/** Creates a virtual type with the given name. */
virtual<T = HydratedDocument<DocType, TInstanceMethods, TVirtuals>>(
virtual<T = HydratedDocument<DocType, TVirtuals & TInstanceMethods>>(
name: keyof TVirtuals | string,
options?: VirtualTypeOptions<T, DocType>
): VirtualType<T>;
Expand Down
Loading

0 comments on commit 55375bf

Please sign in to comment.