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

如何配置GraphQL Codegen为Vue3+Urql+Hasura项目生成类型并解决报错

解决方案

1. 修正GraphQL Codegen配置

绝大多数声明文件报错是因为Vue项目默认开启了isolatedModules编译选项,该选项不允许在声明文件中使用const enum,直接修改codegen.js配置即可解决:

module.exports = {
    overwrite: true,
    generates: {
        './src/generated/graphql.d.ts': {
            schema: [
                {
                    'https://sample-backend-for-hasura-tutorial.hasura.app/v1/graphql': {
                        headers: {
                            'x-hasura-role': 'admin',
                            'x-hasura-admin-secret': 'secret',
                        },
                    },
                },
            ],
            documents: ['./src/**/*.vue'],
            plugins: ['typescript', 'typescript-operations', 'typescript-vue-urql'],
            config: {
                preResolveTypes: true,
                skipTypename: false,
                enumsAsTypes: true,
                constEnums: false, // 把原配置的true改为false
                useTypeImports: true // 新增该配置,自动使用import type导入类型,避免冗余导入报错
            },
        },
    },
}

2. 调整TypeScript配置

确保tsconfig.json的include字段包含生成的类型文件:

{
  "include": [
    "src/**/*.ts",
    "src/**/*.d.ts",
    "src/**/*.tsx",
    "src/**/*.vue"
  ]
}

3. 组件中使用生成的类型获得类型安全

重新运行codegen生成无错的类型文件后,给查询语句命名、引入对应生成的类型传入useQuery泛型即可:

<script setup lang="ts">
    import { useQuery, gql } from '@urql/vue'
    // 引入生成的查询类型
    import type { FetchTodosQuery } from './generated/graphql'

    const FETCH_TODOS = gql`
        query FetchTodos { // 给查询命名,codegen会自动生成对应名称的类型
            todos {
                title
                user {
                    name
                }
                is_public
            }
        }
    `
    // 传入泛型获得类型安全的返回结果
    const result = useQuery<FetchTodosQuery>({ query: FETCH_TODOS })
</script>

<template>
    <div v-if="result.fetching.value">Loading..</div>
    <div v-else-if="result.error.value">{{ result.error.value }}</div>
    <div v-else>
        <ul>
            <li v-for="todo of result.data.value.todos">
                <h4>{{ todo.title }}</h4>
                <p>{{ todo.user.name }}</p>
            </li>
        </ul>
    </div>
</template>

4. 可选:依赖版本校验

如果修改配置后仍有报错,升级所有codegen相关依赖到最新版本即可:

npm install -D @graphql-codegen/cli @graphql-codegen/typescript @graphql-codegen/typescript-operations @graphql-codegen/typescript-vue-urql

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:45:08