Как мне ввести парселитеральный параметр в скаляре даты?

#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 в качестве свойства. Следует устранить любые проблемы с типом, которые у вас возникли