如何为 GraphQLString 类型创建别名?

How to create an alias for a GraphQLString type?

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

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 }
}

那么我应该在这里输入什么代码? 我不完全理解我应该做什么 return .. 显然 ast.value 是不正确的。

甚至可以为 stringint、其他 enums 等基本类型创建别名吗?对象已经正确(特别)命名 - 我发现自己不需要经常重命名它们。

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

其次,我不认为这行是正确的:ast.kind === Kind.GraphQLString。根据我从 source code.

的理解应该是 ast.kind === Kind.STRING

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

const UUID = new GraphQLScalarType({

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