Error in creating a custom validation using mongoose with typescript

Tags: , , ,



 import mongoose, { Schema, model } from "mongoose";

 var breakfastSchema = new Schema({
      eggs: {
        type: Number,
        min: [6, "Too few eggs"],
        max: 12
      },
      bacon: {
        type: Number,
        required: [true, "Why no bacon?"]
      },
      drink: {
        type: String,
        enum: ["Coffee", "Tea"],
        required: function() {
          return this.bacon > 3;
        }
      }
    });

The two errors that I get when I run this code are:

  • Property ‘bacon’ does not exist on type ‘{ type: StringConstructor; enum: string[]; required: () => any; }’
  • ‘required’ implicitly has return type ‘any’ because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions.

Answer

In order to type-check the required function, TypeScript needs to know what type of object this will refer to when required is called. By default, TypeScript guesses (incorrectly) that required will be called as a method of the containing object literal. Since Mongoose will actually call required with this set to a document of the structure you’re defining, you’ll need to define a TypeScript interface for that document type (if you don’t already have one) and then specify a this parameter to the required function.

interface Breakfast {
    eggs?: number;
    bacon: number;
    drink?: "Coffee" | "Tea";
}

var breakfastSchema = new Schema({
     eggs: {
       type: Number,
       min: [6, "Too few eggs"],
       max: 12
     },
     bacon: {
       type: Number,
       required: [true, "Why no bacon?"]
     },
     drink: {
       type: String,
       enum: ["Coffee", "Tea"],
       required: function(this: Breakfast) {
         return this.bacon > 3;
       }
     }
   });


Source: stackoverflow