#javascript #typescript #graphql #nestjs
#javascript #typescript #graphql #nestjs
Вопрос:
Как мне ввести ast
?
import { CustomScalar, Scalar } from '@nestjs/graphql'
import { Kind } from 'graphql'
export class DateScalar implements CustomScalar<number, Date> {
description = 'Date custom scalar type'
parseValue(value: number): Date {
return new Date(value) // value from the client
}
serialize(value: Date): number {
return value.getTime() // value sent to the client
}
parseLiteral(ast): Date { // <-- ???
if (ast.kind === Kind.INT) {
return new Date(ast.value)
}
return null
}
}
Я пытался использовать
interface AST {
kind: string
value: number
}
но тогда я получаю сообщение об ошибке
Property 'parseLiteral' in type 'DateScalar' is not assignable to the same property in base type 'CustomScalar<number, Date>'.
Type '(ast: AST) => Date' is not assignable to type 'GraphQLScalarLiteralParser<Date>'.
Types of parameters 'ast' and 'valueNode' are incompatible.
Type 'ValueNode' is not assignable to type 'AST'.
Property 'value' is missing in type 'VariableNode' but required in type 'AST'
Ответ №1:
Хорошо, посмотрев на интерфейс Nest custom-scalar
, мы можем видеть, что parseLiteral
он имеет тип GraphQLScalarLiteralParser<K>
from graphql
. Покопавшись в типах GraphQL-js, я нашел это определение, где ast
также называется a ValueNode
. A ValueNode
— это объединение других узлов значений, которое содержит такие вещи, как NullValueNode
и ObjectValueNode
которые не имеют value
свойств as, поэтому вы получаете эту ошибку.
Все это предисловие и ссылки говорят: если вы хотите его ввести, используйте import { ValueNode } from 'graphql';
и используйте тип ValueNode
. При использовании ast.Kind === Kind.INT
ast
будет приведено к IntValueNode
элементу, который имеет поле value
в качестве свойства. Следует устранить любые проблемы с типом, которые у вас возникли