首页 > 解决方案 > “不能在没有新的情况下调用类”和“不能重新声明阻塞范围的变量”同时发生

问题描述

我在尝试使用 RESTDataSource 时开始出现错误:

"Class constructor RESTDataSource cannot be invoked without 'new'"

所以我尝试了这个解决方案并添加了"target": "es2016". 我不再收到错误消息。

但现在我收到打字稿编译错误 error TS2451: Cannot redeclare block-scoped variable 'Query'.

显然这是因为打字稿无法将我的文件识别为模块。

所以我尝试了这个解决方案并将其添加export {}到我的文件中,以便它们被识别为模块。但是因为我的目标是es2016我得到Unexpected token 'export'

有什么办法可以同时解决这两个问题?

错误发生在我的代码中,所以我将包括整个回购:https ://github.com/grochadc/filex-graphql-server

tsconfig.json

{
  "compilerOptions": {
    "target": "es2016",
    "moduleResolution": "node",
    "outDir": "dist/",
    "allowSyntheticDefaultImports": true
  },
  "include": ["src/"],
  "exclude": ["node_modules", "**/*.spec.ts"]
}

标签: typescriptapollo-datasource-rest

解决方案


拉出打字稿文档的相关部分

如果您有以下 Node/CommonJS 代码:

var foo = require("foo");

foo.doStuff();

那么您将编写以下 TypeScript 代码:

import foo = require("foo");

foo.doStuff();

并用于出口

你以前可能这样写过:

function foo() {
   // ... 
} 
module.exports = foo;

在 TypeScript 中,您可以使用 export = 构造对其进行建模。

function foo() {
  // ...
}
export = foo;

然后,如果您"module": "CommonJS"在 tsconfig 中进行设置,它会将这些转换回您现在拥有的内容,这是一个遗留限制,如果您没有导入或导出构造,它会假定它不是模块,因此您只需要标记您的文件通过使用import和作为模块export


推荐阅读