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.
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}TypeScript interfeyslari GraphQL interfeyslarini aniqlash uchun ishlatilmaydi.
Bu GraphQL schema ning SDLda quyidagi qismini generatsiya qiladi:
1interface Character {
2 id: ID!
3 name: String!
4}Endi Character interfeysini implementatsiya qilish uchun implements kalitidan foydalaning:
1@ObjectType({
2 implements: () => [Character],
3})
4export class Human implements Character {
5 id: string;
6 name: string;
7}@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:
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:
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.
Buning uchun GraphQLModule konfiguratsiyasida inheritResolversFromInterfaces xossasi true qilib o'rnatilgan bo'lishi kerak.
Schema first
Schema first yondashuvida interfeysni SDL yordamida bevosita aniqlang.
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:
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:
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}Barcha dekoratorlar @nestjs/graphql paketidan eksport qilinadi.