无法重新声明块范围变量

时间:2016-07-28 12:28:49

标签: typescript typescript1.8

我有节点程序,最终使用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 等本地引用的模块可能会定义大多数(全部?)相同的模块,例如{{1我猜不知道模块之间的命名空间范围不受尊重,但我不确定原因。

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

哦,作为额外的背景,我的import是:

tsconfig.json
  

注意:我之前看到其他人已经得到“无法重新声明块范围变量”错误,但是没有一个对话似乎真的完全符合我的情况。虽然我对Typescript很新,所以也许我犯了一个新手的错误。

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

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

这与我通常将其编写为:

的方式形成对比
import up = require('./upload');

但是,当我使用“import”关键字时,它会抱怨const up = require('./upload'); 不是模块:

not a module

1 个答案:

答案 0 :(得分:2)

如果我们查看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个文件而不是更新为全局脚本文件,而是将其作为模块创作。如果您在DefinitelyTyped中看到declaration files for moment in the types-2.0 branch,则可以看到以下行:

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

export = moment与模块系统无关的写作方式module.exports = moment