我有节点程序,最终使用commonjs,因此我的JS文件以许多 require 语句开头。我将这些JS文件重命名为TS,希望我可以逐步进入Typescript但是我遇到了这些错误:
来自以下代码:
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');
upload
,audiences
和messages
等本地引用的模块可能会定义大多数(全部?)相同的模块,例如{{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');
不是模块:
答案 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
。