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
时,您将在智能感知中看到name
、firstname
和password
。
【讨论】:
你说得对。有了它,当我做testUser.firstname
时,我会得到建议。这已经很有帮助了!但是在定义新模型let testUser=new MyUserModel()
时,我没有得到任何建议。有没有办法扩展猫鼬的模型类或其他东西来实现这一点?
我必须定义用户 3 次。 GraphQL、Mongoose 和 TypeScript。糟透了。以上是关于Typescript Mongoose 在 VS Code 中获取 Schema 字段的 IntelliSense 或警告的主要内容,如果未能解决你的问题,请参考以下文章
在 mongoose 的模式类型中使用 TypeScript 类型
无法在 NodeJS 中使用 Mongoose 和 Typescript 扩展基类
带有 Typescript 的 Mongoose Schema - 设计错误