Skip to content

Make SimpleSchema class Generic for typing infering #751

@axelhwang

Description

@axelhwang

Is your feature request related to a problem? Please describe.

We work on a typescript project and I often find myself needing to declare schema with new SimpleSchema(objectSchema) and also declaring the type in typescript

Example:

// A silly example

const chairSchema = new SimpleSchema({
  constructionDate: {
    type: Date,
    autoValue() {
      return new Date();
    },
  },
  legsCount: Number,
});

type ChairToInsert = {
  /**
   * Optional since there is an autovalue
   */
  constructionDate?: Date;
  legsCount: number;
};

type ChairInDatabase = {
  _id: string;
  /**
   * When we fetch for the document in database, the autovalue is set so we get the value
   */
  constructionDate: Date;
  legsCount: number;
};

I found that it's quite redundant since all informations are contained in the schema and it can be painful to maintain in a large scale project.

Describe the solution you'd like

I think it would be great to have a generic schema type

class SimpleSchema<TSchema extends  SimpleSchemaDefinition> {
   constructor(schema: TSchema, options?: SimpleSchemaOptions){
      // Work here
   }
}

And also some type helpers that parses the TSchema type to provide some useful types such as the type inserted and the type received

(not completed) Example:

type OutTypeFromObj<T> = {
  [k in keyof T]: OutTypeFromAny<T[k]>;
};

/** TODO */
type OutTypeFromAny<T> = any;

/**
 * Provides the output type from the database
 */
type OutTypeFromSchema<T> = T extends SimpleSchema<infer U> ? OutTypeFromObj<U> : never;

It would be a nice to have:

  • Input type from schema
  • Output type

That takes into account the defaultValue, autoValue, and 'optional' fields in the schema

Describe alternatives you've considered

Some packages provides such flexibility such as zod, that provides some typing helpers type MyObject = z.infer<typeof someZodObj>

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions