乐闻世界logo
搜索文章和话题

如何在Type-graphql中为并集类型执行字段解析程序

1 个月前提问
1 个月前修改
浏览次数36

1个答案

1

在 Type-GraphQL 中实现并集类型的字段解析程序(resolver function),主要目的是能够处理并集类型中不同成员的数据,并返回正确的类型实例。并集类型(Union types)是 GraphQL 中一个有用的特性,它允许字段具有多种类型。

首先,我们需要定义并集类型。假设我们有两种类型:BookMovie。这两种类型的共同点是它们都是媒体类型,但是它们也有各自唯一的字段。

typescript
import { ObjectType, Field, ID, createUnionType } from "type-graphql"; @ObjectType() class Book { @Field(type => ID) id: string; @Field() title: string; @Field() author: string; } @ObjectType() class Movie { @Field(type => ID) id: string; @Field() title: string; @Field() director: string; } const MediaUnion = createUnionType({ name: "Media", // 为并集设置一个名称 types: () => [Book, Movie] as const, // 定义并集中的类型 resolveType: value => { if ("author" in value) { return Book; // 如果存在`author`字段,则认为是Book类型 } if ("director" in value) { return Movie; // 如果存在`director`字段,则认为是Movie类型 } return undefined; // 如果都不匹配,返回undefined } });

接下来,我们需要为这个并集类型创建一个解析程序:

typescript
import { Resolver, Query, FieldResolver, Root } from "type-graphql"; @Resolver(of => MediaUnion) export class MediaResolver { private books: Book[] = [ { id: "1", title: "1984", author: "George Orwell" }, { id: "2", title: "Brave New World", author: "Aldous Huxley" } ]; private movies: Movie[] = [ { id: "3", title: "Inception", director: "Christopher Nolan" }, { id: "4", title: "Interstellar", director: "Christopher Nolan" } ]; @Query(returns => [MediaUnion]) async getAllMedia(): Promise<Array<typeof MediaUnion>> { return [...this.books, ...this.movies]; // 合并所有媒体类型数据 } @FieldResolver() __resolveType(obj: any) { if (obj.author) { return 'Book'; } if (obj.director) { return 'Movie'; } return null; // 如果都不匹配,返回null } }

在这个例子中,我们创建了 MediaUnion 并集类型,该类型可以是 BookMovie 类型。在 MediaResolver 解析器中,我们通过检查是否存在某个特定的字段(例如 authordirector),来决定返回的具体类型。

__resolveType 方法是自动被 TypeGraphQL 调用的,用来在运行时确定并集类型的具体类型。这使得 GraphQL 能够正确地返回不同的类型,并在客户端正确地查询这些类型的字段。

2024年8月3日 17:44 回复

你的答案