gpt4 book ai didi

typescript - 无法重新声明 block 作用域变量

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:51 25 4
gpt4 key购买 nike

我有一个最终使用 commonjs 的节点程序,因此我的 JS 文件以许多 require 语句开头。我将这些 JS 文件重命名为 TS,希望我可以逐步转移到 Typescript,但我收到了这些错误:

enter image description here

来自以下代码:

const RSVP = require('rsvp');
const moment = require('moment');
const firebase = require('universal-firebase');
const email = require('universal-sendgrid');
const sms = require('universal-twilio');
const merge = require('merge');
const typeOf = require('type-of');
const promising = require('promising-help');
const _ = require('lodash');

const up = require('./upload');
const audience = require('./audiences');
const message = require('./messages');

本地引用的模块,如 uploadaudiencesmessages 可能定义大部分(全部? ) 的相同模块,例如 lodash 等。我猜测在某种程度上命名空间范围在模块之间没有得到尊重,但我不确定为什么。

我也不清楚使用 ES6 import 语法是否可以正确地转换为 ES5 commonjs“require”模块格式(这是使用 Node 0.10.x)。

哦,作为附加上下文,我的 tsconfig.json 是:

{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"removeComments": true,
"sourceMap": true,
"outDir": "./dist",
"watch": true
},
"compileOnSave": true
}

Note: I've seen other people have gotten the "cannot redeclare block-scoped variable" error before but none of the conversations seemed to really fully fit my situation. Although i'm quite new to Typescript so maybe I'm making a newbie mistake.


另外值得注意的是,我注意到一些 commonjs 和 ecmascript 模块格式的奇怪变体的例子:

import up = require('./upload');

这与我通常将其写成的方式相反:

const up = require('./upload');

但是,当我使用“import”关键字时,它会提示 upload.ts 不是一个模块:

not a module

最佳答案

如果我们看一下 current snapshot of moment.d.ts on DefinitelyTyped ,我们将看到它是一个全局脚本文件(而不是模块),其中包含一个名为 moment 的变量:

declare var moment: moment.MomentStatic;

它被认为是全局脚本文件,因为它不导入或导出任何内容。

现在您的 文件也是一个脚本文件。这听起来可能不正确,但想法是 TypeScript 无法将 require 本身识别为导入。 require 在技术上可以是任何其他函数。

相反,您需要为此使用特定的语法:

import moment = require("moment");

所做的只是告诉 TypeScript 这实际上是一个导入,并且可以安全地转换为 CommonJS、AMD、UMD、SystemJS 等中的导入。


附带说明一下,对于 TypeScript 2.0,我们已经将这些 .d.ts 文件更新为不是全局脚本文件,而是作为模块编写。如果您看到 declaration files for moment in the types-2.0 branch在 DefinitelyTyped 中,您可以看到以下几行:

declare var moment: moment.MomentStatic;
export = moment;

其中 export = moment 是与模块系统无关的编写 module.exports = moment 的方式。

关于typescript - 无法重新声明 block 作用域变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38636395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com