Как создать псевдоним для типа GraphQLString? - PullRequest
0 голосов
/ 06 октября 2019

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

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 Ответ

1 голос
/ 07 октября 2019

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

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

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

const UUID = new GraphQLScalarType({

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

...