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

TypeScript项目中typescript-mock-data的onlyOperationTypes配置异常求助

问题:typescript-mock-data配置onlyOperationTypes导致mock文件被清空

我在开发TypeScript项目时,使用typescript-mock-data生成模拟数据。在codegen.ts文件中设置onlyOperationTypes: true,期望仅为操作类型生成模拟数据,但运行代码生成后,graphql.ts文件表现正常,mockers文件却被清空了所有内容。已确认其他配置选项均正常工作,且查阅typescript-mock-data文档未找到onlyOperationTypes的相关说明。请问有人成功在TypeScript项目中使用该配置吗?能否提供正确的配置指导?

配置代码

const config: CodegenConfig = {
overwrite: true,
hooks: {
    afterAllFileWrite: ['prettier --write'],
},
generates: {
    [TYPES_FILE]: {
        schema: graphQLEndpoint,
        documents: GRAPHQL_DOCUMENT_LOCATIONS,
        plugins: [
            {
                add: {
                    content: [autoGeneratedHeader],
                },
            },
            'typescript',
            'typescript-operations',
            'typescript-react-apollo',
        ],
        config: {
            avoidOptionals: {
                field: true,
                object: true,
                defaultValue: true,
            },
            namingConvention: {
                typeNames: 'keep',
                enumValues: 'change-case-all#upperCase',
            },
            exportFragmentSpreadSubTypes: true,
            preResolveTypes: true,
            // onlyOperationTypes: true,
        },
    },
    [MOCKERS_FILE]: {
        schema: graphQLEndpoint,
        documents: GRAPHQL_DOCUMENT_LOCATIONS,
        plugins: [
            {
                add: {
                    content: [autoGeneratedHeader],
                },
            },
            {
                'typescript-mock-data': {
                    typeNames: 'keep',
                    enumValues: 'change-case-all#upperCase',
                    terminateCircularRelationships: true,
                },
            },
        ],
        config: {
            withHooks: false,
            withComponent: false,
            scalars: {
                Time: 'string',
            },
            typesFile: 'src/services/graphql/generated/graphql.ts',
            avoidOptionals: {
                field: true,
                object: true,
                defaultValue: true,
            },
            namingConvention: {
                typeNames: 'keep',
                enumValues: 'change-case-all#upperCase',
            },
            defaultScalarType: 'unknown',
            preResolveTypes: true,
            // onlyOperationTypes: false,

        },
    },
},
};

解决方案

首先明确:onlyOperationTypes是graphql-code-generator中typescript-operations等插件的配置项,并非typescript-mock-data的原生配置,直接在mockers文件的config中设置会导致插件无法识别,进而生成空内容。

要实现仅为操作类型生成模拟数据,可通过以下两种方式:

方式1:指定要生成mock的操作类型

在typescript-mock-data插件的配置中,通过types选项明确列出需要生成mock的操作相关类型(比如Query/Mutation的返回类型):

{
  'typescript-mock-data': {
    typeNames: 'keep',
    enumValues: 'change-case-all#upperCase',
    terminateCircularRelationships: true,
    // 仅为指定的操作类型生成mock
    types: ['GetUserQuery', 'UpdateUserMutation', 'CreatePostMutation']
  },
}

方式2:仅传入包含操作的文档

如果你的GRAPHQL_DOCUMENT_LOCATIONS包含了所有GraphQL文档,可单独创建一个仅存放操作(Query/Mutation)的文档目录,然后在mockers文件的documents选项中指向该目录,插件会自动基于这些文档中的类型生成mock:

[MOCKERS_FILE]: {
  schema: graphQLEndpoint,
  // 仅指向包含操作的文档目录
  documents: 'src/services/graphql/operations/**/*.graphql',
  plugins: [
    // ... 插件配置不变
  ],
  // ... 其他配置不变
}

调整后的完整配置示例

const config: CodegenConfig = {
  overwrite: true,
  hooks: {
    afterAllFileWrite: ['prettier --write'],
  },
  generates: {
    [TYPES_FILE]: {
      schema: graphQLEndpoint,
      documents: GRAPHQL_DOCUMENT_LOCATIONS,
      plugins: [
        {
          add: {
            content: [autoGeneratedHeader],
          },
        },
        'typescript',
        'typescript-operations',
        'typescript-react-apollo',
      ],
      config: {
        avoidOptionals: {
          field: true,
          object: true,
          defaultValue: true,
        },
        namingConvention: {
          typeNames: 'keep',
          enumValues: 'change-case-all#upperCase',
        },
        exportFragmentSpreadSubTypes: true,
        preResolveTypes: true,
        onlyOperationTypes: true, // 这里在typescript-operations中是有效的
      },
    },
    [MOCKERS_FILE]: {
      schema: graphQLEndpoint,
      documents: GRAPHQL_DOCUMENT_LOCATIONS,
      plugins: [
        {
          add: {
            content: [autoGeneratedHeader],
          },
        },
        {
          'typescript-mock-data': {
            typeNames: 'keep',
            enumValues: 'change-case-all#upperCase',
            terminateCircularRelationships: true,
            types: ['GetUserQuery', 'UpdateUserMutation']
          },
        },
      ],
      config: {
        withHooks: false,
        withComponent: false,
        scalars: {
          Time: 'string',
        },
        typesFile: 'src/services/graphql/generated/graphql.ts',
        avoidOptionals: {
          field: true,
          object: true,
          defaultValue: true,
        },
        namingConvention: {
          typeNames: 'keep',
          enumValues: 'change-case-all#upperCase',
        },
        defaultScalarType: 'unknown',
        preResolveTypes: true,
      },
    },
  },
};

内容的提问来源于stack exchange,提问作者Idan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:25:36