контекст
Я пытаюсь создать инструмент для создания кода. Мне нравится использовать GraphQL, однако, когда я владею полным стеком, кажется немного глупым, что мой интерфейс вызывает мой сервер со строго определенными запросами gql. GQL строго типизирован, поэтому я могу предоставлять строго типизированные запросы и ответы.
проблема
Я не знаю, как создать такой интерфейс, чтобы я мог рекурсивно отражать и отображать аргумент из типа ввода в целевой тип. В частности, я хочу сопоставить тип моего запроса запроса с типом ответа запроса gql.
const query: QueryRequest<Food.IFood> = {
name: true // true ==> implies inclusion in response
}
const res = await client.food(query)
console.log(res.name) // PASS - should compile
console.log(res.nodeId) // FAIL - should not compile. `nodeId` was not present in query
// Food.IFood is a TS interface, representative of my GQL schema. GQL => TS interfaces is a solved codegen problem already
// ref: https://github.com/cdaringe/gql-ts-client-codegen/blob/master/src/__tests__/fixture/namespace.ts
QueryRequest<T>
отображает мойFood.IFood
интерфейс (не полностью) в новый тип, где ключи сопоставляются с bools, что указывает на включение поля GQL- However, each client method would need to sniff the passed
QueryRequest<T>
for explicit shape, and somehow map that explicit shape on to, essentially, aPartial<Food.IFood>
.- Cleary I don't want a
Partial
--aPartial
is ambiguous as to which fields are present. I want the client's response to have explicit field membership, as a function of the input.
- Cleary I don't want a
Я понимаю, что приведенное выше описание моего клиента GQL в значительной степени упрощено и исключает другие сложности, необходимые для совместимости со всеми функциями GQL. Это нормально и хорошо. Моя главная цель в этом посте - строго посмотреть, есть ли способ сделать это отображение отраженного типа.
Я начал набрасывать жестко запрограммированный файл target client.ts
для того, чтобы потенциальный результат выглядел здесь: https://github.com/cdaringe/gql-ts-client-codegen/blob/master/src/target.ts
Любой вклад будет оценен! Спасибо.