【问题标题】:How to create an alias for a GraphQLString type?如何为 GraphQLString 类型创建别名?
【发布时间】:2020-02-04 01:52:16
【问题描述】:

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

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 是不正确的。

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

【问题讨论】:

    标签: graphql graphql-js graphql-schema


    【解决方案1】:

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

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

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

    const UUID = new GraphQLScalarType({
    

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

    【讨论】:

    • 是的,谢谢,关于const UUID 的事情-我试图自动解决排序问题。我习惯于使用纯函数式语言以认知最舒适的顺序声明事物-load 透视图,并且不是按执行顺序,并且通过使用UUID() 的函数,我正在提升函数,这意味着声明中的顺序无关紧要.. 是的不好,在我发现调用UUID() 每次都会产生一个新值之后,我发现它不起作用。这有点出乎意料:))
    猜你喜欢
    • 2021-03-03
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多