Как мне обрабатывать ненулевые значения в Typescript, если я не запрашиваю элемент через GraphQL? - Машинопись - GraphQL

У меня есть сервер GraphQL (GQL), и я использую TypeScript (TS) на внешнем интерфейсе. Вот мой тип GQL.

type AutomatedAlgorithmValue {
  politicalEntityAlgorithmValueId: Long
  politicalEntityId: Long!
  ...
}

politicalEntityId не может быть нулевым. Это дает мне поведение, если я запрашиваю politicalEntityId, тогда он гарантированно будет там, но если я не запрашиваю его, запрос выполняется как обычно.

Я использую graphql-codegenerator для создания типов TS из схемы GQL. Типы TS делают politicalEntityId ненулевым, поэтому теперь на внешнем интерфейсе я всегда должен запрашивать politicalEntityId как часть типа AutomatedAlgorithmValue, даже если это не то, что я хочу запрашивать.

В моем внешнем коде я храню данные в ловушке

let [results, setResults] = useState<AutomatedAlgorithmValue[]>([]);

Вот мой запрос GQL

executeAutomatedAlgorithmProcess(politicalEntityId: $id, type: $type) {
    values {
      politicalEntityAlgorithmValueId
    }
  }

На данный момент мне не нужен politicalEntityId, но когда я пытаюсь добавить данные в свой results, компилятор TS знает, что я добавляю null для свойства non-null politicalEntityId, и возникает ошибка.

Еще хуже, если есть объект non-null с другими свойствами non-null, потому что теперь запрос становится все больше и больше с каждым ненужным свойством/объектом non-null.

Как другие справляются с этим? Должен ли я каждый раз создавать новый тип? Нужно ли использовать Pick, чтобы определить, какие данные будут в results hook? Есть ли плагин, который делает все обнуляемым, и если да, то должен ли я его использовать?


person jhamm    schedule 13.01.2021    source источник
comment
просто не дублировать данные из запроса в состояние? это просто не нужно... использовать псевдоним для переименования результата data?   -  person xadm    schedule 14.01.2021
comment
В этом нет необходимости, но тогда я теряю все качества типов, когда использую результат, или мне приходится создавать новые типы каждый раз, когда я извлекаю некоторые данные из запроса GQL, что просто неприемлемо.   -  person jhamm    schedule 14.01.2021


Ответы (1)


Поэтому я думаю, что вы используете тип, сгенерированный на основе вашей схемы GraphQL с помощью плагина typescript graphql-code-generator. Как вы говорите, у этих типов есть каждое поле, указанное в схеме.

Я считаю, что вам также нужно использовать плагин typescript-operations. Плагин операций машинописного текста в основном делает то, о чем вы говорите, используя Pick, но делает это автоматически на основе определенных вами внешних запросов. Таким образом, типы, которые генерирует плагин операций с машинописными текстами, соответствуют операциям, которые вы объявляете.

Вы также часто будете использовать третий плагин поверх этих двух, который специфичен для вашего клиента, например реагировать на запрос, реагировать -apollo, urql и т. д. с готовыми к использованию хуками для каждой операции, которые имеют безопасность типов.

person TLadd    schedule 13.01.2021