如何为GraphQLString类型创建别名?

时间:2019-10-06 14:23:28

标签: graphql graphql-js graphql-schema

在某些语言中,您可以将字符串等基本类型重命名为其他名称:

type alias UUID = String

它仍然是字符串类型,但是现在您可以对代码进行更好的推理了。因为不是Universe中的所有字符串。.只是字符串的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是不正确的。

是否甚至可以为诸如stringint,其他enums等基本类型创建别名?对象已经正确地(特定地)命名了-我发现自己不必经常重命名它们。

1 个答案:

答案 0 :(得分:1)

首先,该日志对我而言似乎正确。您需要区分AST值(它只有几种值类型)和值的类型。因此,在您的情况下,AST值是字符串类型,标量应该只读取字符串,所以一切都很好!

第二,我认为这行是不正确的:ast.kind === Kind.GraphQLString。根据我对source code的了解,应该是ast.kind === Kind.STRING

第三,是否有理由将标量放入函数中,而不是简单地将其分配给变量?标量通常直接引用。在这里,当您在代码中使用UUID()时,就一直在创建标量的新实例...

const UUID = new GraphQLScalarType({

您可能还希望在字符串级别使用更多的验证,否则我只建议使用内置的ID标量。