【问题标题】:Typescript Mongoose get IntelliSense or Warnings for Schema fields in VS CodeTypescript Mongoose 在 VS Code 中获取 Schema 字段的 IntelliSense 或警告
【发布时间】:2019-06-25 10:25:38
【问题描述】:

我想为我的 Mongoose 模型设置代码完成。

因此,如果我创建一个新模型,我想查看在我的 Mongoose Schema 中定义的可用字段。还有编译器的错误/警告,并非所有字段都提供会很好

简单示例

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

我想我必须以某种方式使用接口。但我不知道如何使用它们。

【问题讨论】:

    标签: typescript mongoose visual-studio-code


    【解决方案1】:

    这不是您所期望的。但是,如果您只想获得智能感知,则可以使用一种解决方法。我觉得这就是你需要的。

    //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

    【讨论】:

      【解决方案2】:

      由于您使用的是 TypeScript 和 JS 环境,您可以在创建模型时对 d.ts 文件进行一些更改以实现自动完成。

      1. 转到node_modules/@types/mongoose/index.d.ts
      2. 查找Model 的定义(@types/mongoose=5.5.34 中的第 2881 行)
      3. 进行一些更改

      来自

          new(doc?: any): T;
      

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

      【讨论】:

      • 有没有其他方法可以在不改变猫鼬定义文件的情况下做到这一点?
      • 只批准PullRequest到mongoose的类型定义库
      【解决方案3】:

      不幸的是the Mongoose Model type accepts any in its constructor。因此,您不会收到缺少字段的编译器错误。

      也就是说,以下将实现您所需要的部分:

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

      通过上述设置,当您点入testUser 时,您将在智能感知中看到namefirstnamepassword

      【讨论】:

      • 你说得对。有了它,当我做testUser.firstname 时,我会得到建议。这已经很有帮助了!但是在定义新模型let testUser=new MyUserModel() 时,我没有得到任何建议。有没有办法扩展猫鼬的模型类或其他东西来实现这一点?
      • 我必须定义用户 3 次。 GraphQL、Mongoose 和 TypeScript。糟透了。
      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 2016-11-17
      • 2018-11-11
      • 2022-10-16
      • 2019-09-05
      • 2016-07-26
      • 2021-11-27
      • 2012-11-13
      相关资源
      最近更新 更多