#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 конфигурация пользователей