You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:09:02