我正在转换节点应用程序以使用TypeScript外部模块。运行该应用程序时一切正常,但是当转换我的某些.ts文件时,由于SyntaxError: Unexpected reserved word,mocha测试“爆炸”。

经过大量调试后,我发现了以下可重现的失败案例。我有一个简单的autoRoles.ts文件,它定义了可用的用户角色。在使用外部模块之前,它看起来像:

/// <reference path="../../typings/backend_typings.d.ts" />

module.exports.roles = {
  // role definitions
}


现在,在转换之后:

/// <reference path="../../typings/backend_typings.d.ts" />

export let roles = {
  // role definitions
}


运行摩卡测试时,它会产生以下错误:

>> Mocha exploded!
>> SyntaxError: Unexpected reserved word
>>     at exports.runInThisContext (vm.js:53:16)
>>     at Module._compile (module.js:413:25)
>>     at Object.Module._extensions..js (module.js:452:10)
>>     at Module.load (module.js:355:32)
>>     at Function.Module._load (module.js:310:12)
>>     at Module.require (module.js:365:17)
>>     at require (module.js:384:17)
>>     at Object.<anonymous> (/Users/abc/esupport/code/asp_v4/lib/models/userRole.ts:77:17)
>>     at Module._compile (module.js:434:26)
>>     at Object.Module._extensions..js (module.js:452:10)
>>     at Module.load (module.js:355:32)
>>     at Function.Module._load (module.js:310:12)
>>     at Module.require (module.js:365:17)
>>     at require (module.js:384:17)
>>     at Object.<anonymous> (/Users/abc/esupport/code/asp_v4/lib/users/lib/ssoAuth.ts:7:17)
>>     at Module._compile (module.js:434:26)
>>     at Object.Module._extensions..js (module.js:452:10)
>>     at Module.load (module.js:355:32)
>>     at Function.Module._load (module.js:310:12)
>>     at Module.require (module.js:365:17)
>>     at require (module.js:384:17)
>>     at Object.<anonymous> (/Users/abc/esupport/code/asp_v4/lib/users/index.ts:5:31)


我可以在autoRoles.ts文件的旧实现和新实现之间切换,并使摩卡分别通过和掉落。请注意,userRoles.ts的第77行上有一个require('<path>/autoRoles')

在转译版本之间进行比较时,唯一的区别是旧版本使用“ module.exports”,而新版本仅使用“ exports”。

旧:

/// <reference path="../../typings/backend_typings.d.ts" />
exports.roles = {
  // role definitions
}


新:

/// <reference path="../../typings/backend_typings.d.ts" />
module.exports.roles = {
  // role definitions
}


因此,我知道“导出”只是“ module.exports”的快捷方式,因此我无法解释为什么这会导致摩卡失败,但是我知道,如果我在两者之间切换而未进行任何更改,那么摩卡”爆炸”。我还注意到,对于其他转译模块,tsc有时使用“ module.exports”,有时使用“ exports”。为什么会有差异,更重要的是,为什么摩卡咖啡会爆炸?

最佳答案

意外的保留字


在文件顶部放置"use strict";。您可能有一个作为保留关键字的变量。请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#Paving_the_way_for_future_ECMAScript_versions。如果文件中包含该标头,则TypeScript将警告此类变量名。

module.exports.roles = {不是您的错误源。


  我还注意到,对于其他转译模块,tsc有时使用“ module.exports”,有时使用“ exports”。


它类似于nodejs约定。基本上保存运行时需要解析的字符(字节)。

export let foo = 123;


会给你

exports.foo = 123;


(因为exports == module.export因此exports.foo == module.export.foo ...如您所知)。但是在:

let foo = 123;
export = foo;


确实

var foo = 123;
module.exports = foo;


因为如果您重新分配导出,即exports = foo然后module.export !== exports。因此,您可以将exports用于扩展....但不能分配。

关于node.js - TypeScript外部 Node 模块有时会转换为module.exports和exports,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33405642/

10-12 03:35