在某些语言中,您可以将字符串等基本类型重命名为其他名称:
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
是不正确的。
是否甚至可以为诸如string
,int
,其他enums
等基本类型创建别名?对象已经正确地(特定地)命名了-我发现自己不必经常重命名它们。
答案 0 :(得分:1)
首先,该日志对我而言似乎正确。您需要区分AST值(它只有几种值类型)和值的类型。因此,在您的情况下,AST值是字符串类型,标量应该只读取字符串,所以一切都很好!
第二,我认为这行是不正确的:ast.kind === Kind.GraphQLString
。根据我对source code的了解,应该是ast.kind === Kind.STRING
。
第三,是否有理由将标量放入函数中,而不是简单地将其分配给变量?标量通常直接引用。在这里,当您在代码中使用UUID()
时,就一直在创建标量的新实例...
const UUID = new GraphQLScalarType({
您可能还希望在字符串级别使用更多的验证,否则我只建议使用内置的ID
标量。