首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >导入时选择命名空间而不是函数

导入时选择命名空间而不是函数
EN

Stack Overflow用户
提问于 2021-04-14 14:09:13
回答 1查看 115关注 0票数 0

我正在从事一个项目,在这个项目中,我希望使用gql2ts库从graphql生成类型。在gql-2-ts文件中,我为glob使用了一个名称空间导入,但是类型记录显示了预期的错误。然后,我将导入更改为默认导入,但它仍然选择命名空间对象而不是函数。

gql-2-ts.ts

代码语言:javascript
运行
复制
import fromQuery from '@gql2ts/from-query'
import DEFAULT_OPTIONS from '@gql2ts/language-typescript'

import * as fs from 'fs-extra'
import * as  G from 'glob'  // namespace import 
// import  G from 'glob'    // default import 
import * as graphql from 'graphql'
import * as path from 'path'
import {promisify} from 'util'

const NO_OF_DIRECTORIES_OFFSET = 2
const {Kind} = graphql
const glob = promisify(G)

const readFile = promisify<string, Buffer>(fs.readFile)
const writeFile = <(file: string, content: string) => void>(
  promisify(fs.writeFile)
)

const removeWhiteSpace = (q: string) =>
  q.replace(/\n/g, '').replace(/\s\s*/g, ' ')

const identity = <T>(arg: T): T => arg

const main = async () => {
  const {data} = await fs.readJSON('graphql.schema.json')
  const args = process.argv.slice(2)
  for (let i = 0; i < args.length; i++) {
    const cwd = path.resolve(process.cwd(), args[i])
    const files = await glob('**/*.graphql', {
      cwd: cwd
    })

    const allEnumsArray = await Promise.all(
      files
        .map((i) => path.resolve(cwd, i))
        .map((path) => compileFile(path, data, args[i]))
    )

    const enumsData: EnumData = {}
    allEnumsArray.forEach((enumsMap) => {
      if (enumsMap) {
        Object.keys(enumsMap).forEach((enumName) => {
          enumsData[enumName] = enumsMap[enumName]
        })
      }
    })

    const allEnums = Object.keys(enumsData)
    await Promise.all(
      allEnums.map((enumName) =>
        writeEnumsFile(enumName, enumsData[enumName], args[i])
      )
    )

    console.log(`Compiled ${files.length} files inside ${args[i]}`) // tslint:disable-line
  }
}

main().catch((err) => {
  console.error(err) // tslint:disable-line
  process.exit(1)
})

这是我的tsconfig文件。

代码语言:javascript
运行
复制
{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "skipLibCheck": true,
    "jsx": "react",
    "esModuleInterop": true,
    "downlevelIteration": true,
    "allowSyntheticDefaultImports": true,
    "lib": [
      "dom", "dom.iterable"
    ]
  },
  "exclude": ["node_modules"]
}

在名称空间导入的情况下,我将得到以下错误

  • 类型起源于此导入。命名空间样式的导入无法调用或构造,并将在运行时导致失败.考虑在这里使用默认的导入或导入要求。*

在使用默认导入时

。From_query_1.default(.).map不是函数

因为它选择了命名空间对象。

我找到了一位与此相关的医生,但没有多大帮助。

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html

注意:新的行为是在一个标志下添加的,以避免对现有代码库进行不必要的中断。我们强烈建议将其应用于新的和现有的项目。对于现有项目,需要将名称空间导入(导入*作为来自“express”的表示;express();)转换为默认导入(从“express”导入快件;express();)。

EN

回答 1

Stack Overflow用户

发布于 2021-04-15 09:08:10

我解决了问题。在一些库中存在版本冲突。将这些版本用于下列库

  • "@gql2ts/from-query":"^1.9.0",

  • "@gql2ts/language-typescript":"^1.9.0"

并使用默认导入,它将工作。保持帖子,以防有人遇到同样的错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67093374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档