3
votes

Typescript Mongoose obtenir IntelliSense ou des avertissements pour les champs de schéma dans VS Code

Je souhaite configurer une complétion de code pour mes modèles Mongoose.

Donc, si je crée un nouveau modèle, j'aimerais voir les champs disponibles qui sont définis dans mon schéma Mongoose. Aussi des erreurs / avertissements du compilateur, que tous les champs ne sont pas fournis, ce serait bien

Exemple simple

//define Schema
const MyUserSchema = new Schema({
    name: String,
    firstname: String,
    password: String
})

//create Model
export const MyUserModel = model('user', MyUserSchema)

//instance of MyUserModel
let testUser = new MyUserModel({
    //want IntelliSense for fields here
    name: "Lastname",
    firstname: "Firstname",
    password: "securepassword"
}):

Je pense en quelque sorte que je dois utiliser des interfaces. Mais je ne sais pas comment les utiliser.


0 commentaires

3 Réponses :


1
votes

Malheureusement, le type Mongoose Model accepte any dans son constructeur . Par conséquent, vous ne recevrez pas d'erreurs du compilateur pour les champs manquants.

Cela dit, les éléments suivants permettront d'obtenir une partie de ce dont vous avez besoin:

import { Document, Schema, model } from 'mongoose';

interface User {
    name: String,
    firstname: String,
    password: String
}

interface UserModel extends User, Document { }

const MyUserSchema = new Schema({
    name: String,
    firstname: String,
    password: String,
})

export const MyUserModel = model<UserModel>('user', MyUserSchema)

let testUser = new MyUserModel({
    name: 'foo',
    firstname: 'bar',
    password: 'baz'
});

Avec la configuration ci - dessus, lorsque vous dot en testUser vous verrez le name , firstname et password de password dans le IntelliSense.


1 commentaires

Tu as raison. Avec cela, je reçois des suggestions lorsque je fais testUser.firstname . Cela aide déjà beaucoup! Mais lors de la définition du nouveau modèle, let testUser=new MyUserModel() je ne reçois pas de suggestions. Y a-t-il un moyen d'étendre la classe Model de mangouste ou quelque chose pour y parvenir également?



3
votes

Étant donné que vous utilisez l'environnement TypeScript et JS, vous avez la possibilité d'apporter des modifications aux fichiers d.ts pour obtenir une saisie semi-automatique lors de la création du modèle.

  1. Accédez à node_modules/@types/mongoose/index.d.ts
  2. Trouver la définition du Model (ligne 2881 dans @ types / mongoose = 5.5.34)
  3. Faites quelques changements

de

    new(doc?: Omit<T, keyof Document>): T;

à

    new(doc?: any): T;

travail de saisie semi-automatique :)


2 commentaires

y a-t-il un autre moyen de faire cela sans changer le fichier de définition de la mangouste?


Uniquement approuvé PullRequest à la bibliothèque de définition de type de mangouste



0
votes

Ce n'est pas exactement ce à quoi vous vous attendez. Mais il existe une solution de contournement disponible si vous souhaitez uniquement obtenir Intellisense. Je pense que c'est ce dont vous avez besoin.

//Define interface
interface User {
  name: String;
  firstname: String;
  password: String;
}

interface UserModel extends User, mongoose.Document {}

//define Schema
const MyUserSchema = new mongoose.Schema({
  name: String,
  firstname: String,
  password: String,
});

//create Model
export const MyUserModel = mongoose.model<UserModel>('user', MyUserSchema);

let input: Partial<UserModel> = {
  //Get your intellisense here
  name: 'Lastname',
  firstname: 'Firstname',
  password: 'securepassword',
};

//instance of MyUserModel
let testUser = new MyUserModel(input);

testUser.firstname //get your intellisense here as well


0 commentaires