0

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

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.logast我看到这个:

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

那么我应该在这里有什么代码?我不完全理解我应该返回什么......显然ast.value是不正确的。

甚至可以为基本类型创建别名,如string, int, otherenums等?对象已经正确(特别)命名 - 我发现自己不需要经常重命名它们。

4

1 回答 1

1

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

其次,我不认为这条线是正确的:ast.kind === Kind.GraphQLString. 它应该ast.kind === Kind.STRING来自我从源代码中理解的内容。

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

const UUID = new GraphQLScalarType({

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

于 2019-10-07T11:04:40.797 回答