如何为GraphQL Codegen生成的查询类型中的嵌套Maybe指定类型?
方案1:自定义递归工具泛型处理嵌套非空
你可以全局定义一次递归工具泛型,后续所有嵌套类型取值都可以直接复用,不需要每层手动包裹NonNullable:
// 递归去除所有层级的 null/undefined 类型,兼容数组、对象场景 type DeepNonNullable<T> = T extends null | undefined ? never : T extends Array<infer U> ? Array<DeepNonNullable<U>> : T extends object ? { [K in keyof T]: DeepNonNullable<T[K]> } : T; // 按传入的路径层级自动取嵌套类型,自动处理每层的非空逻辑 type DeepIndex<T, Path extends Array<string | number | symbol>> = Path extends [infer FirstKey, ...infer RestKeys] ? FirstKey extends keyof DeepNonNullable<T> ? RestKeys extends Array<string | number | symbol> ? DeepIndex<DeepNonNullable<T>[FirstKey], RestKeys> : never : never : DeepNonNullable<T>;
使用示例:
// 原写法存在Maybe时会报错 // type Iresponse = myType['level1']['level2'] // 新写法直接传入路径即可,自动处理所有层级非空 type Iresponse = DeepIndex<myType, ['level1', 'level2']>
方案2:调整GraphQL Codegen生成规则,从根源减少Maybe
如果你的业务场景下不需要处理字段空值(比如网关层已经做了空值兜底,或者Schema中的nullable仅用于异常兼容、业务无需感知),可以直接修改Codegen配置,生成类型时直接去掉不必要的Maybe:
// codegen.ts 配置示例 import type { CodegenConfig } from '@graphql-codegen/cli'; const config: CodegenConfig = { // 其余连接、文档配置省略 generates: { './src/generated/type.ts': { plugins: ['typescript', 'typescript-operations'], config: { // 开启后所有可选字段都会生成为非空类型,仅适用于业务完全无需处理空值的场景 avoidOptionals: true, // 严格匹配标量类型定义,避免不必要的空值包装 strictScalars: true, } } } }; export default config;
调整配置后重新生成的类型默认就没有多余的Maybe,你原来的myType['level1']['level2']写法可以直接正常使用。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

