Typescript Mongoose få IntelliSense eller varningar för schemafält i VS Code


Jag vill ställa in en kodkomplettering för mina Mongoose-modeller.

Så om jag skapar en ny modell skulle jag vilja se de tillgängliga fälten som är definierade i mitt Mongoose-schema. Även fel/varningar från kompilatorn, att inte alla fält tillhandahålls, skulle vara bra

Enkelt exempel

//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"
}):

Jag tror att jag på något sätt måste använda gränssnitt. Men jag kan inte lista ut hur man använder dem.

Svar #1

Eftersom du använder TypeScript och JS-miljö, har du möjlighet att göra vissa ändringar i d.ts-filer för att uppnå autokomplettering när du skapar modell.

  1. Gå till node_modules/@types/mongoose/index.d.ts
  2. Hitta definitionen av Model (rad 2881 i @types/mongoose=5.5.34)
  3. Gör några ändringar

från

    new(doc?: any): T;

till

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

Svar #2

Tyvärr accepterar Mongoose Model-typen any i sin konstruktor. Som ett resultat kommer du inte att få kompilatorfel för saknade fält.

Det sagt, kommer följande att uppnå en del av det du behöver:

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'
});

Med ovanstående inställning, när du punkterar in i testUser kommer du att se name, firstname och password i intellisense.

Relaterade artiklar