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.
3 Réponses :
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.
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?
É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.
node_modules/@types/mongoose/index.d.ts
Model
(ligne 2881 dans @ types / mongoose = 5.5.34)de
new(doc?: Omit<T, keyof Document>): T;
à
new(doc?: any): T;
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
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