无法重新声明块作用域变量(打字稿)

dcs*_*san 66 require typescript

我正在构建一个节点应用程序,并且.js中的每个文件内部用于执行此操作以在各种包中要求.

let co = require("co");
Run Code Online (Sandbox Code Playgroud)

但是得到

在此输入图像描述

所以使用打字稿似乎在整个项目中只能有一个这样的声明/要求?我对此感到困惑,因为我认为let它的范围是当前文件.

我刚刚有一个正在运行的项目但是在重构之后我现在正在处理这些错误.

谁能解释一下?

Joh*_*isz 49

let用于声明块作用域中存在的局部变量而不是函数作用域.

导入外部模块的最新首选方法是ES6语法,它不包含任何明确的赋值:

if (condition) {
    let a = 1;
    ...
    let a = 2;
}
Run Code Online (Sandbox Code Playgroud)

  • 这给了"找不到模块公司".我也尝试过`typings install co`,它在注册表中"无法找到"co".还有其他想法吗? (8认同)
  • 请注意,“* as xxx”很重要。所以,不是“import xxx from ...”,而是“import * as xxx from ...” (2认同)
  • 在我将其添加到我的`tsconfig.json`:`"module": "commonjs"`之前,我无法在我的nodejs应用程序中使用导入 (2认同)

小智 31

我在 vscode 上使用 ts 时也处理过这个问题。我解决这个问题的方法很简单,但可能与你的问题不一样。

当我在最近的选项卡中同时打开 typescript 文件和 javascript 文件时,我的编辑器显示此错误。我只是关闭它,错误就消失了。

希望这可以帮助那些可能也因这个简单的错误而摸不着头脑的人。

  • 一个很好的答案,解决了问题,谢谢!仅当在 Vscode 中同时打开 .ts 和 .js 文件时才会出现该错误,关闭 .js 文件后问题就消失了。 (4认同)

Obi*_*nya 18

对于这个时代来到这里的人,这里有一个简单的解决方案。它至少在后端对我有用。我没有检查前端代码。

只需添加:

export {};
Run Code Online (Sandbox Code Playgroud)

在代码的顶部。

感谢EUGENE MURAVITSKY


倪俊杰*_*倪俊杰 14

这可以通过 tsconfig.json 中的 "moduleDetection": "force" 解决:

{
  "compilerOptions": {
    "moduleDetection": "force"
  }
}   
Run Code Online (Sandbox Code Playgroud)

参考: https: //www.typescriptlang.org/tsconfig#moduleDetection

原始答案:/sf/answers/5247765561/


Nev*_*ngi 11

我能得到的最好的解释是Tamas Piro的帖子

TLDR;TypeScript将DOM类型用于全局执行环境。在您的情况下,全局窗口对象上有一个'co'属性。

要解决这个问题:

  1. 重命名变量,或者
  2. 使用TypeScript模块,并添加一个空的export {}:
export{};
Run Code Online (Sandbox Code Playgroud)

要么

  1. 通过不添加DOM类型来配置编译器选项:

在TypeScript项目目录中编辑tsconfig.json。

{
    "compilerOptions": {
        "lib": ["es6"]
      }
}
Run Code Online (Sandbox Code Playgroud)

  • 我确认添加 `export {}` 确实解决了我的问题,但是添加 `"compilerOptions": { "lib": ["es6"] }` 似乎在编译期间和 VSCode 中都没有帮助。 (5认同)
  • 这解决了我的问题,但我想知道他们必须做出这样的决定的原因是什么。我在文件上添加 `export {}` 没有问题,但如果我有大约 30 个文件,那就很烦人了。 (4认同)

Tom*_*tam 10

编译Node.JS Typescript应用程序时收到以下类似错误:

node_modules/@types/node/index.d.ts:83:15 - error TS2451: Cannot redeclare block-scoped variable 'custom'.

解决方法是删除此:

"files": [
  "./node_modules/@types/node/index.d.ts"
]
Run Code Online (Sandbox Code Playgroud)

并替换为:

"compilerOptions": {
  "types": ["node"]
}
Run Code Online (Sandbox Code Playgroud)


bma*_*pin 8

我的解决方案是将我的代码从使用 CommonJS (requiremodule.exports等)转换为 ES 模块(importexport等)

TypeScript 文档似乎还推荐了 ES 模块语法:TypeScript Modules

当然,还有更多的内容,但首先:

  1. require将的实例替换为import,例如

    代替:

    const https = require('https');
    
    Run Code Online (Sandbox Code Playgroud)

    和:

    import https from 'https';
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将默认值替换为module.exportsexport default例如

    代替:

    module.exports = myVar ...
    
    Run Code Online (Sandbox Code Playgroud)

    和:

    export default myVar ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将其他替换module.exportsexport, 例如

    代替:

    module.exports.myVar = 
    
    Run Code Online (Sandbox Code Playgroud)

    或者:

    module.export = { myVar ... }
    
    Run Code Online (Sandbox Code Playgroud)

    和:

    export myVar ...
    
    Run Code Online (Sandbox Code Playgroud)

更多内容请参见:从 CommonJS 到 ES 模块:如何实现 Node.js 应用程序的现代化


小智 8

\xc2\xb4s 是编辑器警告,因为当你打开已编译的index.js 和index.ts 时。你会看到这个..但是当你关闭index.js 时就没事了。

\n


Bel*_*ter 6

使用IIFE(Immediately Invoked Function Expression)IIFE

(function () {
    all your code is here...

 })();
Run Code Online (Sandbox Code Playgroud)