graphql +猫鼬+打字稿,如何减少重复的模型定义

sli*_*wp2 5 graphql graphql-js

我使用mongoosetypescriptgraphql构建我的应用。

我是全栈开发人员。

问题是我定义字段类型的模型FIVE倍。

服务器端:

models/book.ts

// first time
interface IBook extends mongoose.Document {
  title: string;
  author: string;
} 

// second time
const bookSchema = new mongoose.Schema({
  title: String,
  author: String
})

const Book: mongoose.Model<IBook> = mongoose.model<IBook>('Book', bookSchema)
Run Code Online (Sandbox Code Playgroud)

graphql/typeDefs.ts

const typeDefs = `
  // third time
  type Book {
    title: String!
    author: String!
  }

  // fourth time
  input BookInput {
    title: String!
    author: String!
  }
`
Run Code Online (Sandbox Code Playgroud)

客户端:

interfaces/book.ts

// fifth time
interface IBook {
  title: string;
  author: string;
}
Run Code Online (Sandbox Code Playgroud)

如你看到的。的titleauthor字段和类型被定义FIVE倍。

有三个主要缺点:

  1. 重复的
  2. 缺乏可维护性
  3. 低效的

有办法解决吗?我认为这几乎是一个DRY问题。

这是我的想法:

  1. 通用应用程序-提取客户端和服务器端使用的一些通用模块。
  2. 做一个工具来处理这个。

    • 制作一个项目生成器或命令行工具,例如ng-cli用于静态生成模型和类型,这意味着在运行时之前

    • 在运行时动态定义模型decoratorsyntax sugar动态生成模型和类型

Fra*_*rga 2

我们最近遇到了这个问题,要求我们在 Mongoose 模式旁边维护一个重复的 Typescript 接口(对我们来说,这个问题只是服务器端的,因为我们没有使用 graphql 或客户端 Typescript)

我们构建了mongoose-tsgen来解决这个问题。它可能无法处理此处涉及的所有情况,但可以轻松引导来处理您的用例。

它读取您的 Mongoose 模式并生成一个index.d.ts文件,其中包含每个文档和子文档的接口。这些接口可以直接从 mongoose 模块导入,如下所示:

import { IUser } from "mongoose"

async function getUser(uid: string): IUser {
  // `user` is of type IUser
  const user = await User.findById(uid)
  return user;
}

Run Code Online (Sandbox Code Playgroud)