GraphQL2 min read

Interfeyslar

Ko'plab type tizimlari kabi, GraphQL ham interfeyslarni qo'llab-quvvatlaydi. Interface - bu ma'lum fieldlar to'plamiga ega bo'lgan, interfeysni implementatsiya qiluvchi type lar bu

Ko'plab type tizimlari kabi, GraphQL ham interfeyslarni qo'llab-quvvatlaydi. Interface - bu ma'lum fieldlar to'plamiga ega bo'lgan, interfeysni implementatsiya qiluvchi type lar bu fieldlarni o'z ichiga olishi shart bo'lgan abstrakt tur (batafsil bu yerda).

Code first

Code first yondashuvida GraphQL interfeysini @nestjs/graphql paketidan eksport qilinadigan @InterfaceType() dekoratori bilan belgilangan abstrakt klassni yaratish orqali aniqlaysiz.

TypeScript
1import { Field, ID, InterfaceType } from '@nestjs/graphql';
2
3@InterfaceType()
4export abstract class Character {
5  @Field(() => ID)
6  id: string;
7
8  @Field()
9  name: string;
10}
Warning

TypeScript interfeyslari GraphQL interfeyslarini aniqlash uchun ishlatilmaydi.

Bu GraphQL schema ning SDLda quyidagi qismini generatsiya qiladi:

Graphql
1interface Character {
2  id: ID!
3  name: String!
4}

Endi Character interfeysini implementatsiya qilish uchun implements kalitidan foydalaning:

TypeScript
1@ObjectType({
2  implements: () => [Character],
3})
4export class Human implements Character {
5  id: string;
6  name: string;
7}
Hint

@ObjectType() dekoratori @nestjs/graphql paketidan eksport qilinadi.

Kutubxona tomonidan generatsiya qilinadigan default resolveType() funksiyasi resolver metodidan qaytgan qiymatga qarab turini aniqlaydi. Bu shuni anglatadiki, siz klass instansiyalarini qaytarishingiz kerak (oddiy JavaScript obyektlarini qaytara olmaysiz).

Custom resolveType() funksiyasini berish uchun @InterfaceType() dekoratoriga uzatiladigan opsiyalar obyektida resolveType xossasini ko'rsating, quyidagicha:

TypeScript
1@InterfaceType({
2  resolveType(book) {
3    if (book.colors) {
4      return ColoringBook;
5    }
6    return TextBook;
7  },
8})
9export abstract class Book {
10  @Field(() => ID)
11  id: string;
12
13  @Field()
14  title: string;
15}

Interfeys resolverlari

Hozirgacha interfeyslardan foydalanib faqat field ta'riflarini bo'lishishingiz mumkin edi. Agar field resolverlarning haqiqiy implementatsiyasini ham bo'lishmoqchi bo'lsangiz, quyidagicha maxsus interfeys resolverini yaratishingiz mumkin:

TypeScript
1import { Resolver, ResolveField, Parent, Info } from '@nestjs/graphql';
2
3@Resolver((type) => Character) // Reminder: Character is an interface
4export class CharacterInterfaceResolver {
5  @ResolveField(() => [Character])
6  friends(
7    @Parent() character, // Resolved object that implements Character
8    @Info() { parentType }, // Type of the object that implements Character
9    @Args('search', { type: () => String }) searchTerm: string,
10  ) {
11    // Get character's friends
12    return [];
13  }
14}

Endi friends field resolveri Character interfeysini implementatsiya qiladigan barcha object turlar uchun avtomatik ro'yxatdan o'tkaziladi.

Warning

Buning uchun GraphQLModule konfiguratsiyasida inheritResolversFromInterfaces xossasi true qilib o'rnatilgan bo'lishi kerak.

Schema first

Schema first yondashuvida interfeysni SDL yordamida bevosita aniqlang.

Graphql
1interface Character {
2  id: ID!
3  name: String!
4}

So'ng quick start bobida ko'rsatilganidek, typings generatsiyasi funksiyasidan foydalanib mos TypeScript ta'riflarini yaratasiz:

TypeScript
1export interface Character {
2  id: string;
3  name: string;
4}

Interfeyslar resolver mapda qaysi type ga yechilishini aniqlash uchun qo'shimcha __resolveType fieldini talab qiladi. CharactersResolver klassini yaratamiz va __resolveType metodini aniqlaymiz:

TypeScript
1@Resolver('Character')
2export class CharactersResolver {
3  @ResolveField()
4  __resolveType(value) {
5    if ('age' in value) {
6      return Person;
7    }
8    return null;
9  }
10}
Hint

Barcha dekoratorlar @nestjs/graphql paketidan eksport qilinadi.