Я пытаюсь найти способ отличить (и отфильтровать) встроенные типы от моих пользовательских типов при запуске introspectionQuery против API-интерфейса graphql. Кажется, в выводе нет ничего надежного, чтобы определить, какие типы являются встроенными (кроме __ перед «системными» типами).
На данный момент я даже не могу найти ни одного официального списка, поэтому мой лучший вариант, похоже, — просмотреть вывод introspectionQuery и составить список для будущего использования, надеясь, что ничего не изменится.
Действительно ли нет систематического способа различить их?
@pkatsourakis, к сожалению, нет. Но, как говорится в ответе ниже, они довольно прямолинейны и вряд ли изменятся :)


Хотя спецификация делает определяет скалярные типы, которые должна включать каждая реализация, и указывает, как эти скаляры должны сериализоваться и анализироваться, на самом деле она не проводит различия между этими встроенными скалярами и любыми другими, которые может предоставлять служба GraphQL. Функционально нет разницы между «встроенным» типом и «настраиваемым».
Имеется пять встроенных скаляров указано в спецификации. Вряд ли они изменятся в будущем.
Есть также несколько «мета»-типов, которые явно используются для самоанализа. Они обозначены здесь.
Имена, начинающиеся с двух символов подчеркивания (__), являются зарезервированными именами, поэтому любые типы с именами, начинающимися таким образом, можно смело классифицировать как «встроенные».
Из вашего вопроса неясно, с какой целью вы пытаетесь провести различие между «встроенными» и «настраиваемыми» типами, но я предполагаю, что для большинства целей мы будем рассматривать вышеперечисленное как «встроенные» типы и любые другие "на заказ".
Мой вариант использования — повторно используемая тестовая установка, в которой я перебираю типы, возвращаемые запросом самоанализа (предоставляемым модулем graphqlnpm), и проверяю такие вещи, как описание. Это также полезно в таких сценариях, как создание документации для API или создание интроспективного браузера данных. Спасибо за ссылки, я просто пойду по спецификации :)
Вы можете использовать функцию isIntrospectionType:
import { buildSchema, isIntrospectionType } from 'graphql';
const schema = buildSchema(source);
for (const type of Object.values(schema.getTypeMap())) {
if (isIntrospectionType(type)) continue;
// do something...
}
PS. Вы также можете использовать isSpecifiedScalarType для фильтрации скалярных узлов, таких как ID, Int и т. д.
Вы когда-нибудь находили запрос, чтобы сделать это?