使用多个装饰器将 Type-GraphQL 与 Typegoose 相结合

Posted

技术标签:

【中文标题】使用多个装饰器将 Type-GraphQL 与 Typegoose 相结合【英文标题】:Combining Type-GraphQL with Typegoose using Multiple Decorators 【发布时间】:2020-12-14 05:51:15 【问题描述】:

我正在使用 Type-GraphQl(它是一个 Typescript 库,可让您使用 Typescript 类自动生成 GraphQL 模式和解析器)和 Typegoose(它对 Mongoose 查询执行相同的操作)。我正在尝试减少定义我的数据的文件数量,理想情况下,我只有一个 GQL 和 MongoDB 中的数据的真实来源。

这两个库可以组合起来,以便我使用单个 Typescript 类在一个文件中描述 both 我的 GQL 架构和 Mongoose 类型吗?

例如,一个简单的 type-graphql 文件(定义“书”类型)如下所示:

import  Field, ObjectType  from "type-graphql";
import  InStock  from "./gql/shared/types";

@ObjectType()
export class Book extends InStock 
  @Field()
  title: string;

  @Field()
  publicationDate: Date;

  @Field()
  author: string;

  @Field()
  pages: number;

typegoose 类看起来非常相似,但使用 @prop 装饰器来设置架构的属性:

import * as mongoose from "mongoose";
import  getModelForClass, prop  from "@typegoose/typegoose";
import  InStock  from "./mongoose/shared/types";

class BookClass extends InStock 
  @prop()
  public title: string;
  @prop()
  public author: string;
  @prop()
  public publicationDate: Date;
  @prop()
  public pages: number;
  @prop()


export const Book = getModelForClass(BookClass);

是否可以将这两种类型与 both 装饰器结合在同一个文件中,还是会破坏typegoose/type-graphl?像这样:

import * as mongoose from "mongoose";
import  Field, ObjectType  from "type-graphql";
import  InStock  from "./shared";
import  getModelForClass, prop  from "@typegoose/typegoose";

export class Book extends InStock  // Export type-graphql here...
  @prop()
  @Field()
  public title: string;
  @prop()
  @Field()
  public author: string;
  @prop()
  @Field( nullable: true )
  public publicationDate?: Date;
  @prop()
  @Field()
  public pages: number;


export const Book = getModelForClass(BookClass); /// Export typegoose here...

【问题讨论】:

【参考方案1】:

我见过很多用户一起成功使用 typegoose 和 typegraphql

@ObjectType()
export class Book extends InStock 
  @prop()
  @Field()
  public title: string;

  @prop()
  @Field()
  public author: string;

  @prop()
  @Field( nullable: true )
  public publicationDate?: Date;

  @prop()
  @Field()
  public pages: number;


export const Book = getModelForClass(BookClass);

Here some offical examples from TypeGraphQL

【讨论】:

以上是关于使用多个装饰器将 Type-GraphQL 与 Typegoose 相结合的主要内容,如果未能解决你的问题,请参考以下文章

如何使用装饰器将类的方法添加到类内的列表中

如何使用装饰器将参数绑定到静态方法函数?

Storybook 6 装饰器将道具传递给故事不起作用

在 Zend Framework 中,如何使用装饰器将表单元素包装在标签中?

在 type-graphql 突变中传递多个参数以及 `GraphQLUpload`

Python functools.partial - 如何使用静态装饰器将其应用于类方法