Как создать псевдоним для типа GraphQLString?
В некоторых языках вы можете переименовать базовый тип, например строку, во что-нибудь другое:
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
не является правильным.
Можно ли вообще создавать псевдонимы для основных типов, таких как string
, int
, Другой enums
так далее? Объекты уже имеют правильные (определенные) имена - мне не нужно слишком часто их переименовывать.
1 ответ
Во-первых, журнал мне кажется правильным. Вам нужно различать значение AST (оно имеет только несколько типов значений) и тип значения. Итак, в вашем случае значение AST - это строковый тип, а ваш скаляр должен читать только строки, так что все хорошо!
Во-вторых, я не думаю, что эта строка верна: ast.kind === Kind.GraphQLString
. Так должно бытьast.kind === Kind.STRING
из того, что я понял из исходного кода.
В-третьих, есть ли причина, по которой вы помещаете скаляр в функцию, а не просто присваиваете его переменной? На скаляры обычно ссылаются напрямую. Здесь вы все время создаете новые экземпляры скаляра, когда используетеUUID()
в вашем коде...
const UUID = new GraphQLScalarType({
Вы также можете использовать дополнительную проверку на строковом уровне, в противном случае я бы просто предложил использовать встроенный ID
скаляр.