首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TypeGraphQL中返回联合

在TypeGraphQL中返回联合
EN

Stack Overflow用户
提问于 2021-01-16 20:52:44
回答 1查看 150关注 0票数 0

所以我有这样的代码:

代码语言:javascript
复制
const getAllUsers = ({
  Model, options,
}) => Model.find(options).catch((e) => {
  throw e;
});

@ObjectType({ description: "User model" })
@Entity()
export class UserModel extends BaseEntity {
    ...
}

@ObjectType()
class Error {
  constructor(data: {message: string, code: number}) {
    this.message = data.message;
    this.code = data.code;
  }
  @Field(() => Int)
  code: number;
  @Field(() => String)
  message: string;
}

@ObjectType()
class Success {
  @Field(() => [ UserModel ])
  users: [UserModel];
}

const UserResponseType = createUnionType({
  name: "UserResponseType",
  types: () => [
    Success,
    Error,
  ] as const,
});

@Query(() => [ UserResponseType ])
async getAllUsers(): Promise<typeof UserResponseType> {
  const errors = await Promise.resolve([
    new Error({
      code: 501,
      message: "test",
    }),
  ]);
  const users = await getAllUsers({
    Model: UserModel,
    options: {
      ...
    },
  }).catch((e) => e);
  return {
    errors,
    success: users,
  };
}

我想要做的就是返回错误或成功,这样我就可以在查询中做到这一点:

代码语言:javascript
复制
query getAllUsers {
  getAllUsers {
    ... on Success {
      user {
        id
        email
      }
    }
    ... on Error {
      code
      message
    }
  }
}

但现在我得到的是:

代码语言:javascript
复制
TS2322: Type '{ errors: Error[]; success: any; }' is not assignable to type 'Error | Success'.
Object literal may only specify known properties, and 'errors' does not exist in type 'Error | Success'.

我试图复制(https://typegraphql.com/docs/unions.html#docsNav)[这个例子],那么如何实现上面提到的查询能力呢?

EN

回答 1

Stack Overflow用户

发布于 2021-05-15 00:02:54

async getAllUsers()返回的值与声明的返回值Promise<typeof UserResponseType>不匹配,这会导致TS2322错误。

该函数返回具有errorssuccess属性的对象,但它应返回ErrorSuccess实例。像这样的东西应该是有效的:

代码语言:javascript
复制
import {
  createUnionType,  
  Field,
  Int,
  ObjectType,
  Query,
  Resolver,
} from "type-graphql";

@ObjectType({ description: "User model" })
export class UserModel {
  @Field()
  id: string;
}

@ObjectType()
class Error {
  @Field(() => Int)
  code: number;
  @Field(() => String)
  message: string;
}

@ObjectType()
class Success {
  @Field(() => [UserModel])
  users: UserModel[];
}

const UserResponseType = createUnionType({
  name: "UserResponseType",
  types: () => [Success, Error] as const,
  resolveType: (value) => {
    if ("code" in value) {
      return Error;
    }
    if ("users" in value) {
      return Success;
    }
    return undefined;
  },
});

@Resolver()
export class UserResolver {
  @Query(() => UserResponseType)
  async getAllUsers(): Promise<typeof UserResponseType> {
    const error: Error = {
      code: 501,
      message: "test",
    };
    const success: Success = { users: [{ id: "1" }, { id: "2" }] };
    return success;
  }
}

现在,运行以下查询将返回用户的ids。如果将return success;更改为return error;,则查询将返回错误详细信息。

代码语言:javascript
复制
query getAllUsers {
  getAllUsers {
    ... on Success {
      users {
        id
      }
    }
    ... on Error {
      code
      message
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65749868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档