Как создать псевдоним для типа GraphQLString?

В некоторых языках вы можете переименовать базовый тип, например строку, во что-нибудь другое:

type alias UUID = String

Это по-прежнему строковый тип, но теперь вы можете лучше рассуждать о коде. Потому что это не все строки во вселенной.. это просто форма строк UUID. И вы сможете быстрее обнаружить ошибку.

Я пробовал сделать то же самое в graphql, но не работает:

function UUID (){
  return new GraphQLScalarType({
    name: 'UUID',
    serialize: uidAsString => { return uidAsString },
    parseValue:  uidAsString => { return uidAsString },
    parseLiteral(ast) {

      console.log(ast)                       // log below

      if (ast.kind === Kind.GraphQLString) {
        return ast.value;
      }
      return null;
    }
  });
}

Ошибка:

{
  "errors": [
    {
      "message": "Expected type UUID!, found \"what?\"; Kind is not defined",
      "locations": [
        {
          "line": 2,
          "column": 30
        }
      ]
    }
  ]
}

Когда console.log ast я вижу это:

{
  kind: 'StringValue',
  value: 'what?',
  block: false,
  loc: { start: 41, end: 48 }
}

Итак, какой код мне здесь нужен? Я не совсем понимаю, что мне нужно вернуть... и очевидноast.value не является правильным.

Можно ли вообще создавать псевдонимы для основных типов, таких как string, int, Другой enumsтак далее? Объекты уже имеют правильные (определенные) имена - мне не нужно слишком часто их переименовывать.

1 ответ

Решение

Во-первых, журнал мне кажется правильным. Вам нужно различать значение AST (оно имеет только несколько типов значений) и тип значения. Итак, в вашем случае значение AST - это строковый тип, а ваш скаляр должен читать только строки, так что все хорошо!

Во-вторых, я не думаю, что эта строка верна: ast.kind === Kind.GraphQLString. Так должно бытьast.kind === Kind.STRINGиз того, что я понял из исходного кода.

В-третьих, есть ли причина, по которой вы помещаете скаляр в функцию, а не просто присваиваете его переменной? На скаляры обычно ссылаются напрямую. Здесь вы все время создаете новые экземпляры скаляра, когда используетеUUID() в вашем коде...

const UUID = new GraphQLScalarType({

Вы также можете использовать дополнительную проверку на строковом уровне, в противном случае я бы просто предложил использовать встроенный ID скаляр.

Другие вопросы по тегам