нельзя использовать тип 'object' для типов полей Type-GraphQL - PullRequest
3 голосов
/ 13 февраля 2020

Я хотел бы создать слой GraphQL для моего API Nest Js. Поэтому на основе этого интерфейса, содержащего пары ключ / значение

export interface Mapping {
  id: string;
  value: object;
}

, я создал DTO, действующий в качестве типа возврата для запросов GraphQL

@ObjectType()
export class MappingDTO {
  @Field(() => ID)
  id: string;

  @Field()
  value: object;
}

Поэтому, когда я хочу найти все сопоставления Я бы придумал это

  @Query(() => [MappingDTO])
  public async mappings(): Promise<Mapping[]> {
    return this.mappingsService.getMappings();
  }

К сожалению, я не могу использовать object для поля значения. Я получаю эту ошибку

NoExplicitTypeError: Необходимо указать явный тип для значения MappingDTO #!

При изменении типа, например, на string ошибка не возникает при запуске. Дело в том, что я не могу указать явный тип, потому что мой MongoDB хранит объекты, содержащие «что-нибудь».

Как я могу исправить свой преобразователь или DTO для работы с типом объекта?


Редактировать:

То же самое для декоратора резольвера. Когда у меня есть это

  @Query(() => Object)
  public async getValueByKey(@Args('id') id: string): Promise<object> {
    return this.mappingsService.getValueByKey(id);
  }

Я получаю эту ошибку

Ошибка: невозможно определить тип вывода GraphQL для getValueByKey

Ответы [ 2 ]

4 голосов
/ 13 февраля 2020

Похоже, вы должны использовать пользовательский JSON скаляр. Как и этот .

import { GraphQLJSONObject } from 'graphql-type-json'

. Затем его можно использовать непосредственно в полевом декораторе:

@Field(() => GraphQLJSONObject)
value: object

или вы можете оставить декоратор как @Field() и добавьте соответствующий scalarsMap к опциям, которые вы передаете buildSchema. См. документы для получения дополнительной информации.

0 голосов
/ 13 февраля 2020

Просто чтобы подчеркнуть тот факт, что вся идея GraphQL - декларативная выборка данных. Также вы можете определить пользовательские типы в GraphQL, у скалярных типов нет объекта как опции, но вы можете определить свой собственный тип, подобный этому.

type customObject {
      keyOne: Int!
      KeyTwo: String!
      ...
      key(n): ...
}

и использовать этот тип в интерфейсах, запросах, мутациях:

export interface Mapping {
      id: string;
      value: customObject;
}

Вы можете подумать, что вам придется определять каждый ключ объекта, который вы храните в mongoDB в этом типе customObject, но вам это не нужно. вот где начинается декларативное извлечение данных GraphQL. Вы определяете только те поля в типе (customObject), который хотите использовать во внешнем интерфейсе, вам не нужно извлекать полный объект из БД.

...