Skip to content

Commit ea16fd9

Browse files
Create InferDocType utility.
1 parent 1b21255 commit ea16fd9

File tree

3 files changed

+26
-2
lines changed

3 files changed

+26
-2
lines changed

test/types/schema.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Schema, Document, SchemaDefinition, Model, Types, InferSchemaType, SchemaType, Query, HydratedDocument } from 'mongoose';
1+
import { Schema, Document, SchemaDefinition, Model, Types, InferSchemaType, SchemaType, Query, HydratedDocument, InferDocType, FlatRecord } from 'mongoose';
22
import { expectType, expectError, expectAssignable } from 'tsd';
33

44
enum Genre {
@@ -507,6 +507,10 @@ export function autoTypedSchema() {
507507

508508
expectError<AutoTypedSchemaType['schema'] & { doesNotExist: boolean; }>({} as InferredSchemaType);
509509

510+
type InferredDocType = InferDocType<typeof AutoTypedSchema>;
511+
512+
expectType<FlatRecord<AutoTypedSchemaType['schema'] & AutoTypedSchemaType['virtuals']>>({} as InferredDocType);
513+
510514
return AutoTypedSchema;
511515
}
512516

types/inferschematype.d.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,19 @@ declare module 'mongoose' {
2323
* // result
2424
* type UserType = {userName?: string}
2525
*/
26-
type InferSchemaType<SchemaType> = ObtainSchemaGeneric<SchemaType, 'DocType'> ;
26+
type InferSchemaType<SchemaType> = ObtainSchemaGeneric<SchemaType, 'DocType'>;
27+
28+
/**
29+
* @summary Obtains document plain doc type from Schema instance.
30+
* @description Exactly like {@link InferSchemaType}, but it add virtual paths.
31+
* @param {SchemaType} SchemaType A generic of schema type instance.
32+
* @example
33+
* const userSchema = new Schema({userName:String});
34+
* type UserType = InferDocType<typeof userSchema>;
35+
* // result
36+
* type UserType = {userName?: string}
37+
*/
38+
type InferDocType<SchemaType> = FlatRecord<InferSchemaType<SchemaType> & ObtainSchemaGeneric<SchemaType, 'TVirtuals'>>;
2739

2840
/**
2941
* @summary Obtains schema Generic type by using generic alias.

types/utility.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,12 @@ type IfEquals<T, U, Y = true, N = false> =
3131
(<G>() => G extends T ? 1 : 0) extends
3232
(<G>() => G extends U ? 1 : 0) ? Y : N;
3333

34+
35+
/**
36+
* @summary Converts Unions to one record "object".
37+
* @description It makes intellisense dialog box easier to read as a single object instead of showing that in multiple object unions.
38+
* @param {T} T The type to be converted.
39+
*/
40+
type FlatRecord<T> = { [K in keyof T]: T[K] };
41+
3442
}

0 commit comments

Comments
 (0)