node.js - 打字稿在导入时选择命名空间而不是函数
问题描述
我正在做一个项目,我想使用 gql2ts 库从 graphql 生成类型。在 gql-2-ts 文件中,我使用了 glob 的命名空间导入,但 typescript 向我显示了预期的错误。然后我将导入更改为默认导入,但它仍然选择命名空间对象而不是函数。
gql-2-ts.ts
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文件。
{
"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
注意:新行为添加在一个标志下,以避免对现有代码库进行无根据的中断。我们强烈建议将其应用于新项目和现有项目。对于现有项目,命名空间导入(import * as express from "express"; express();)将需要转换为默认导入(import express from "express"; express();)。
解决方案
我解决了这个问题。某些库中存在版本冲突。将这些版本用于以下库
"@gql2ts/from-query": "^1.9.0",
"@gql2ts/language-typescript": "^1.9.0"
并使用默认导入,它将起作用。保留帖子以防有人遇到同样的错误。
推荐阅读
- excel - 在 Excel 中使用两个变量显示完整的行
- flutter - 首次运行应用程序出现此错误
- python - 如果我们不在 kafka 中使用传递回调,在生产之后调用 poll() 是否有任何意义?
- python - pandas countif 使用 where() 为负数
- wordpress - 如何在 Gravity Forms 中制作文件上传进度条?
- amazon-web-services - AWS SSM:传递标签名称而不是实例 ID
- python - 有没有办法让 dask read_csv 忽略空文件?
- java - Java中的一维数组
- c# - 如何修复 Unity 2D 中的空引用异常
- spring-boot - 处理存储在 DB 中的字典值 - Spring