如何在 ObjectType 字段注释中使用泛型声明 (nestjs)

mas*_*ari 5 annotations graphql nestjs

我需要为我的 graphql 类型创建自定义分页结果。

这是我PaginateResult@ObjectType

@ObjectType()
export class PaginateResult<T> {
    @Field()
    docs: T[];
    
    @Field()
    totalDocs: string;
    
    @Field()
    totalPages: string;
}
Run Code Online (Sandbox Code Playgroud)

及其在解析器中的调用:

@Query((type) => PaginateResult<User>, { nullable: true })
async getUsers(@Args({ type: () => GetAllUserArgs }) args: GetAllUserArgs) {
    const queryResolver: QueryResolver = new QueryResolver(args);
    return this.userService.getAll(queryResolver.query);
}
Run Code Online (Sandbox Code Playgroud)

User@ObjectType

@ObjectType()
export class User {
    @Field(() => ID)
    id: string;
    
    @Field()
    fullName: string;
    
    @Field()
    companyName: string;
    
    @Field()
    mobile: string;
    
    @Field({ nullable: true })
    profilePhoto?: string;
    
    @Field()
    isActive: boolean;
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,我收到此错误:

错误:未定义的类型错误。确保为“PaginateResult”类的“docs”提供显式类型。

小智 9

您必须定义 PaginateResult 类型:

import { Field, Int, ObjectType } from '@nestjs/graphql';
import { Type } from '@nestjs/common';

export function PaginateResult<T>(ItemType: Type<T>): any {
  @ObjectType({ isAbstract: true })
  abstract class PageClass {
    @Field(() => [ItemType])
    docs: T[];

    @Field(() => Int)
    totalPages: number;
  }

  return PageClass;
}
Run Code Online (Sandbox Code Playgroud)

使用通用函数工厂创建专用类型类:

import { User } from './user.model';
import { ObjectType } from '@nestjs/graphql';
import { Paginated } from 'src/types/paginated-result.type';

@ObjectType()
export class UserPage extends PaginateResult(User) {}
Run Code Online (Sandbox Code Playgroud)

并在解析器中调用它

  @Query(() => UserPage)
  async getUsers(
    @Args() args: GetAllUserArgs,
  ): Promise<UserPage | HttpException> {
    return this.usersService.getAll(args);
  }
Run Code Online (Sandbox Code Playgroud)