The ts compiler says that none of the properties exist on type 'Document'.
It seems that because of this none of the properties on the model can be set. If I print a user object to the console all I get is {"_id":"long hex id number"}
My model is configured as follows:
users.ts
import * as mongoose from 'mongoose';
import * as crypto from 'crypto';
import * as jwt from 'jsonwebtoken';
var userSchema = new mongoose.Schema({
    email: {
        type: String,
        unique: true,
        required: true
    },
    firstMidname: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    hash: String,
    salt: String
});
userSchema.methods.setPassword = setPassword;
userSchema.methods.validPassword = validPassword;
userSchema.methods.generateJwt = generateJwt;
export = mongoose.model('User', userSchema);
Api connection point api.ts
import * as express from    'express';
import * as mongoose from   'mongoose';
import * as passport from   'passport';
var User = mongoose.model('User');
var router = express.Router();
router.post('/', createUser);
function createUser(req, res){
var user = new User();
    console.log(user);
    user.firstMidName = req.body.firstName;
    user.lastName = req.body.lastName;
    user.setPassword(req.body.password);
    user.save((err) => {
        console.log("saving user");
        var token;
        token = user.generateJwt();
        res.status(200);
        res.json({
            'token': token
        });
    });
}
export = router;
How can I fix or troubleshoot this issue? Nothing in the user.save block executes.
EDIT: The two things seem to be unrelated. I can now save to the database however the typescript error persists. Is this expected behaviour?
Fixed this by adding interface upon declaration of schema
interface UserInterface extends Document {
  email: string;
}
const User = new Schema<UserInterface>({
  email: String;
})
                        The mongoose.model method accepts a type that defaults to mongoose.Document, which won't have properties you want on your User document.
To fix this, create an interface that describes your schema and extends mongoose.Document:
export interface UserDoc extends mongoose.Document {
  email: {
    type: string;
    unique: boolean;
    required: boolean;
  }
  ...
}
Then, pass that through as the type for your model:
export = mongoose.model<UserDoc>('User', userSchema);
When I defined my entity interface I had it extending "Document" but had not imported anything.
When I crtl+click on it though I can see that it incorrectly thinks I was referring to the built-in node object "Document":
/** Any web page loaded in the browser and serves as an entry point into the web page's content, which is the DOM tree. */
interface Document extends Node, DocumentAndElementEventHandlers, DocumentOrShadowRoot, GlobalEventHandlers, NonElementParentNode, ParentNode, XPathEvaluatorBase {
After I explicitly told it to use Document from the mongoose library things worked. 👍
import { Document } from 'mongoose';
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With