类型化写法全解析)
后端【免费下载链接】graffleSimple GraphQL Client for JavaScript. Minimal. Extensible. Type Safe. Runs everywhere.项目地址https://gitcode.com/gh_mirrors/gr/graffle点击查看免费下载本文以 Graffle 仓库中 “DocumentBuilder → Alias” 示例示例导航片段 指向的 Alias 示例页为主体讲解在 Graffle 的类型化 TypeScript 查询接口中如何书写 GraphQL 字段别名三种语法各自的适用条件、最小示例到完整$batch实战代码并结合仓库源码与测试说明别名是如何被类型系统约束和最终编码进 GraphQL 文档的。读完后你将能在 Graffle 生成的 client 上用字符串、短数组、完整元组三种形式安全地编写别名且无需手写 GraphQL 字符串。1. 背景Graffle 的“用 TypeScript 写 GraphQL 文档”Graffle 是一个极简、可扩展、类型安全的 JavaScript/TypeScript GraphQL client。通过Graffle.create()生成的 client 会暴露类型化的query/mutation方法族调用方直接以 TypeScript 对象字面量描述选择集selection set由 Graffle 在内部将其编码为 GraphQL 文档——你不需要拼接任何查询字符串也不需要用代码生成器维护独立的类型文件。本仓库examples/$/目录下就包含一套完整生成的 Pokémon schema client 模块供所有示例直接复用入口模块Graffleclient 的导出入口全局注册站点内VitePress Twoslash示例需显式导入的生成模块执行方法类型DocumentRunner定义负责把run返回值的 Promise 泛型推导为对应的结果类型。Alias 示例使用的执行入口是pokemon.query.$batch(...)——一次调用中批量执行多个命名操作返回结果以操作名为键的对象。这也是别名最典型的使用场景同一字段在多处或带不同参数被查询需要用别名区分返回键名。2. 三种别名语法及其适用条件Alias 示例页 明确了别名共有三种写法这是本节的核心内容完整继承原文档完整语法Full syntax[aliasName, selectionSet]适用于所有字段当字段带有必填参数required arguments或选择集非标量non-scalar selection时必须使用该语法。短数组Short array[aliasName]仅适用于无必填参数的标量字段等价于[aliasName, true]。纯字符串String onlyaliasName同样仅适用于无必填参数的标量字段等价于[aliasName, true]是三者中最简洁的选项。从类型结构看字段值的位置接受true仅选该标量字段、aliasName、[aliasName]或[aliasName, selectionSet]这些形态最终都被归一化为“别名 选择集”的完整描述。选择集本身可以是嵌套对象其中$键携带该字段的参数如filter这正是完整语法存在的意义复杂选择无法被aliasName或[aliasName]这种“等价于 true”的形式表达。3. 完整示例$batch查询中的三种别名混用以下为仓库 示例源码 的核心代码原文档示例页中为站点 Twoslash 环境增加了生成模块的显式导入此处以仓库内可直接运行的版本为准import { Graffle } from ../$/graffle/_.js import { showJson } from ../$/helpers.js const pokemon Graffle.create() const day 1000 * 60 * 60 * 24 const year day * 365.25 const yearsAgo100 new Date(Date.now() - year * 100) const yearsAgo1 new Date(Date.now() - year) const pokemons await pokemon.query.$batch({ pokemons: [ // Full syntax - required when field has arguments or complex selection [elderPokemons, { $: { filter: { birthday: { lte: yearsAgo100 } } }, name: true, id: elderId, // String syntax (most concise) // ^^^^^^^^^^ hp: [elderHp], // Short array syntax // ^^^^^^^^^^^^ }], [babyPokemons, { $: { filter: { birthday: { gte: yearsAgo1 } } }, name: babyName, // String syntax (most concise) // ^^^^^^^^^^^^ }], ], }) showJson(pokemons)逐行解读pokemon.query.$batch({ ... })声明了一个名为pokemons的批量操作其值是操作列表每个操作本身也可以是[alias, selectionSet]的完整元组形式——这里的elderPokemons/babyPokemons就是“操作级”的别名。每个元素内部的$键携带参数{ filter: { birthday: { lte: yearsAgo100 } } }表示“生日早于 100 年前”老年宝可梦gte则表示“最近一年内”宝宝宝可梦。这印证了第 2 节的规则——带参数的字段只能使用完整语法[elderPokemons, {...}]。id: elderId纯字符串与hp: [elderHp]短数组分别演示了标量字段的最简别名写法两者都等价于[elderId, true]/[elderHp, true]。结果键名与别名一一对应name未加别名保持原名id/hp则分别以elderId/elderHp为键。运行输出示例输出文件 记录了该示例的确定输出Pokémon 测试 schema 数据固定{ elderPokemons: [ { name: Pikachu, elderId: 1, elderHp: 35 }, { name: Squirtle, elderId: 3, elderHp: 44 } ], babyPokemons: [ { babyName: Charizard } ] }可以看到id的值1/3被放到了elderId键下hp值被放到了elderHp键下——别名精确控制了响应对象的键名这正是 GraphQL 字段别名的语义在类型化接口中的体现。4. 源码视角别名如何被类型系统承接从源码结构看示例中所有别名写法最终汇入 Graffle 的请求管线两个关键位置可以佐证类型级测试requestMethods.test-d.ts 中包含// $batch with aliases一节的类型断言测试专门验证$batch场景下别名的结果类型推导例如elderPokemons的结果对象应包含elderId、elderHp键。这意味着“写错别名形态”会在编译期而非运行期暴露。结果类型推导DocumentRunner 中run方法的返回类型通过GraphqlKit.Document.Object.InferResult.Operation...从文档对象本身推导——别名作为选择集的一部分参与推导因此pokemons.elderPokemons[i].elderHp这类访问在类型层面是精确的number而不是退化为any。另外DocumentBuilder 扩展文档 与 示例快照 共同保证了示例与其输出的一致性快照测试会在 CI 中核对实际编码出的 GraphQL 文档与 JSON 输出读者可据此放心复制示例代码。5. 使用建议与小结场景推荐写法示例标量字段、无必填参数纯字符串aliasName最简洁id: elderId标量字段、无必填参数短数组[aliasName]hp: [elderHp]字段带参数 / 非标量选择集 / 需嵌套选择完整语法[aliasName, selectionSet][elderPokemons, { $: {...}, name: true }]不需要别名字段值直接写true或选择集对象name: true要点回顾三种别名语法中完整语法是唯一通用形式带参数或复杂选择的字段必须使用它短数组与纯字符串是“等价于[alias, true]”的简写仅限无参标量字段。别名作用于返回对象的键名示例输出中elderId/elderHp/babyName键即为直接证据。由于 Graffle 的选择集本身就是 TypeScript 对象别名写法同时受类型检查与快照测试双重保障无需手写 GraphQL 字符串即可得到类型安全、键名精确的查询结果。如需进一步掌握 DocumentBuilder 的静态文档、指令、联合类型等能力可继续阅读同目录的 alias.md 周边示例页如static.md、directive.md以及 DocumentBuilder 测试。赞分享后端【免费下载链接】graffleSimple GraphQL Client for JavaScript. Minimal. Extensible. Type Safe. Runs everywhere.项目地址https://gitcode.com/gh_mirrors/gr/graffle点击查看免费下载相关推荐KotlinMultiPlatform 数据层实现跨平台数据库管理与网络请求终极指南KotlinMultiPlatform 数据层实现跨平台数据库管理与网络请求终极指南 KotlinMultiPlatform 是一个面向Android、iOSTanStack Form 深度解析 DeepKeys 类型别名类型安全字段名的底层实现TanStack Form 深度解析 DeepKeys 类型别名类型安全字段名的底层实现 DeepKeysT 是 TanStack Form 类型系统的基石前端UI组件Sway 高级类型使用 Type Alias 为类型起别名告别冗长类型签名Sway 高级类型使用 Type Alias 为类型起别名告别冗长类型签名 本篇技术指南围绕 Sway 智能合约语言中的「类型别名Type Alias」编程语言编译器区块链上一篇ncmdump NCM 转 MP3 教程3 次拖拽搞定转换下一篇Mi-Create免费的小米手表表盘可视化工具三步做出自己的表盘创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考