Typescript Mongoose 在 VS Code 中获取 Schema 字段的 IntelliSense 或警告

Posted

技术标签:

【中文标题】Typescript Mongoose 在 VS Code 中获取 Schema 字段的 IntelliSense 或警告【英文标题】:Typescript Mongoose get IntelliSense or Warnings for Schema fields in VS Code 【发布时间】: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"
):

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

【问题讨论】:

【参考方案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 文件进行一些更改以实现自动完成。

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

来自

    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。糟透了。

以上是关于Typescript Mongoose 在 VS Code 中获取 Schema 字段的 IntelliSense 或警告的主要内容,如果未能解决你的问题,请参考以下文章

在 mongoose 的模式类型中使用 TypeScript 类型

无法在 NodeJS 中使用 Mongoose 和 Typescript 扩展基类

带有 Typescript 的 Mongoose Schema - 设计错误

如何在 typescript 中使用 mongoose 在 mongodb 中插入数据?

TypeScript 中的 Mongoose 方法范围

使用 Typescript 在 Mongoose 中缺少子文档方法