2015-12-03 78 views
3

我的Visual Studio 2015年社区Node.js的+工具 我已经创建了“空白Node.js的控制台应用程序”打字稿项目我的名字空间没有定义。打字稿

我已经增加了一个打字稿文件,TypeScript1.ts并提出以下几点:

module MyModule { 
    export class Calculator { 
     add(x: number, y: number): number { 
      return x + y; 
     }; 
     constructor() { } 
    } 
} 

在主文件,app.ts我把这个:

/// <reference path="TypeScript1.ts" /> 
console.log('Hello world'); 
var subject: MyModule.Calculator; 
subject = new MyModule.Calculator(); 
var result: number = subject.add(2, 3); 
console.log(result); 

它建立没有问题,但是当我尝试调试/运行,它指出:

ReferenceError: MyModule is not defined 
    at Object.<anonymous> (C:\Users\User\Documents\Visual Studio 2015\Projects\NodejsConsoleApp1\NodejsConsoleApp1\app.js:8:15) 

我该怎么做?

回答

0

我会检查app.js的内容,如果它包含代码从TypeScript1.ts文件。我的猜测是,它没有。

可以按如下方式来解决它运行tsc

tsc --module commonjs --target es5 --outFile app.js TypeScript1.ts app.ts 

请注意--outFile选项。

+0

感谢您回答Martin.app.js不包含它实际上,我不需要运行这个文件,我尝试使用Mocha测试TypeScript1.ts文件并获得了同样的错误为什么我的app.js不包含TypeScript1的代码? –

+0

嗯,这是因为TS编译器假定你要么使用内部模块es,在这种情况下,'/// '注释仅用于从由'--outFile'参数指定的最终文件中的'.ts'文件中正确地命令脚本。或者,您可以根据需要使用“输入”模块的外部模块。 (有用的资源http://www.typescriptlang.org/Handbook#modules-splitting-across-files) –

+0

谢谢,我在发布问题之前阅读了这篇文章,尽管我完全理解它是相当尴尬的。对我来说是内部还是外部?所有文件都在单个项目中。我如何才能实现自动构建Mocha测试以测试TypeScript1.ts? –

0

我相信有一些问题(假设打字稿1.5+):

第一:/// <reference path="TypeScript1.ts" />

应该是:import MyModule from "./TypeScript1";

其次,我相信你需要export module MyModule

或者你可以做变化

module MyModule { 
     export class Calculator { 
      add(x: number, y: number): number { 
       return x + y; 
      }; 
      constructor() { } 
     } 
    } 

 export default class Calculator { 
      add(x: number, y: number): number { 
       return x + y; 
      }; 
      constructor() { } 
     } 

然后import Calculator from "./TypeScript1";

或者交替

 export class Calculator { 
      add(x: number, y: number): number { 
       return x + y; 
      }; 
      constructor() { } 
     } 

然后import {Calculator} from "./TypeScript1";

分别根据其上面您选择。

第一个创建Calculator类作为主要导出,如果计算器是您计划保留在文件中的主要内容,那么它很有用,如果计划在文件中有多个同等重要的东西,则第二个是有用的。

此外,模块关键字一般不会再使用,而是使用命名空间关键字,因为模块关键字太混乱,太多人将其与文件导入模块混淆。

+0

您好,MBeatty,谢谢您的回复。我编辑过TypeScript1.ts: export class Calculator add(x:number,y:number):number { return x + y; }; 构造函数(){} } 和app.ts: 从“TypeScript1.ts”导入计算器 console.log('Hello world'); var subject:MyModule.Calculator; subject = new MyModule.Calculator(); var result:number = subject.add(2,3); console.log(result); Visual Studio强调“TypeScript1.ts”并指出“无法找到模块'TypeScript1.ts'”。 App1和TypeScript1都位于同一个文件夹中。 –

+0

值得尝试的两件事:从导入语句中删除“.ts”扩展名和/或用“./”作为前缀,下次我接近我的TypeScript开发设置时,我会尝试一下,但如果你打我在这里张贴,我会确保适当地编辑答案。 – MBeatty

+0

是的,看起来像添加“./”应该修复它。您可以保留或关闭“.ts”。公约将是离开它。所以约定会从“TypesScript1”导入计算器; – MBeatty

0

命名空间的工作,甚至没有引用... 我用这样的事情...

sript1。TS

namespace A{ 
     class AA{ 
      var x:number; 
      constructor(x:number){ 
        this.x=x; 
      } 
     } 
} 

script2.ts

var y:A.AA = new A.AA(3); 

命名空间会工作,即使这些文件是在项目的不同的文件夹。我没有引用或导入任何东西。

0

它现在2017年的圣诞节,他们仍然还没有确定这个> :( 亚历山大的解决方案是正确的“Visual Studio代码”使用您tsconfig.json文件如下:。

"compilerOptions": { 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "module": "system", 
    "outFile": "bundle.js", 
    "target": "es5" 
}, 

你然后运行捆绑文件“node bundle”