我有節點程序,它最終使用commonjs,因此我的JS文件以需要語句開頭。我改名這些JS文件TS,希望我能逐步進入打字稿,但我得到這些錯誤:無法重新聲明塊範圍變量
從下面的代碼:
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
是很可能會定義大部分(全部?)相同的模塊,如lodash
等。我在猜測命名空間範圍在某種程度上沒有被尊重但是我不知道爲什麼。
我也不清楚是否使用ES6 import
語法將適當transpile到ES5 CommonJS的「規定」模塊格式(這是使用節點0.10.x)。
哦額外的背景下,我tsconfig.json
是:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"removeComments": true,
"sourceMap": true,
"outDir": "./dist",
"watch": true
},
"compileOnSave": true
}
注:我見過其他人已經得到了「不能重新聲明塊範圍的變量」錯誤之前,但沒有交談似乎真的完全適合我的情況。雖然我對打字稿很陌生,所以也許我會犯新手錯誤。
另外值得注意的是,我注意到CommonJS的和ECMAScript模塊格式的奇特變異的一些例子:
import up = require('./upload');
這與如何我通常寫爲:
const up = require('./upload');
當我使用「導入」的關鍵字,但是,它抱怨說upload.ts
是不是一個模塊:
我仍然對TS很感興趣,所以我可能缺少突出點,但我不確定你對我的建議。我可能會補充說,「時間」似乎工作正常...... intellisense正在工作,沒有編譯錯誤。對於我正在操作的其他npm模塊,這不是真的。 – ken
@ken只有模塊可以從其中導入,並且使文件成爲模塊的唯一方法是如果它具有某種類型的指示器,即它是模塊。這包括導入,導出或'export = foo'語句。因此,如果你的文件沒有被解析爲模塊,你需要*通過明確使用導出來使它們成爲模塊*。因此,而不是'module.exports.foo =函數(){}' 你會寫 '導出函數foo(){}' 我的建議也把你的'常量富=要求(「富「)'調用使用'import foo = require(」foo「)'。 –
哦,我明白了;是的,我的模塊都在輸出適當的功能。我最初使用的是node/commonjs語法,但已經開始使用ES6「導出」修改器。 – ken