GraphQL: существует ли эквивалент TypeScript «unknown»?

#typescript #graphql #apollo-server #graphql-js

#typescript #graphql #apollo-сервер #graphql-js

Вопрос:

В GraphQL у меня есть несколько запросов, которые поддерживают разбивку на страницы. Запросы принимают cursor параметр и возвращают nextCursor параметр.

Тип cursor/nextCursor не важен для потребителя. Это может быть a Number или a String или, может быть, даже объект — это просто деталь реализации, о которой клиент не должен заботиться. Разные запросы могут даже использовать разные типы курсоров.

Есть ли какой-либо способ смоделировать это в GraphQL?

В TypeScript есть unknown тип, который в основном говорит: «Я не знаю, что это за тип, но это нормально, мне не нужно знать».

Комментарии:

1. spec.graphql.org/June2018/#sec-Types … что стоит проверить на что-либо? … использовать объединения?

Ответ №1:

Я думаю, что нашел то, что искал: пользовательский скаляр:
https://www.apollographql.com/docs/apollo-server/schema/custom-scalars/

Пример:

 scalar Cursor
type Query {
  getStrings(count: Int, cursor: Cursor): Result!
}
type Result {
  strings: [String]!
  nextCursor: Cursor
}
 

Пользовательский скалярный тип может быть любым — потребителю не нужно знать. Сервер решает, как обрабатывать значение (сериализовать, десериализовать и т. Д.).

Комментарии:

1. похоже на ID? … и [вы утверждаете, что] должен использовать FE TS dev (потребитель) cursor: any … хммм, где это знаменитое безопасное / менее подверженное ошибкам кодирование типа TS? … Я не думаю, что это «просто деталь реализации, о которой клиент не должен заботиться»

2. … конечно, вы можете использовать scalar при разработке [общей] библиотеки … но для конкретного «экземпляра» должно быть опубликовано, какой предполагаемый тип (принятый как / подтвержденный) для этого скаляра (int или string), чтобы дать разработчикам FE возможность типобезопасного кодирования

3. Клиент не должен заботиться о значении. Они просто получают курсор из первого запроса и передают его следующему запросу.

4. частично верно… но все аргументы API graphql должны быть напечатаны … сообщите этому TSLint с помощью «no-any»: true, «no-unsafe-any»: true конфигурация пользователей