如何使用NTVS中的单独文件中的类编译nodejs Typescript项目?

时间:2014-08-15 15:35:26

标签: node.js typescript ntvs

NTVS = Visual Studio的节点工具

我使用server.js作为主文件创建了一个新项目。然后创建了几个类,每个类都在他们的文件中。所有这些文件都在references.ts文件中引用。

所有文件都包含对references.ts的引用。

但是,我的项目没有运行。它说有些类不存在。

所以我勾选"将Javascript输出合并到文件"但是来自server.ts的代码没有附加到生成的文件中(所有类都很难)。

我如何使用内部参考?

编辑: 这是我使用的文件

server.ts

/// <reference path="references.ts"/>

import http = require('http');

var html = new HtmlElement('html');
...

类别/ HtmlElement.ts

class HtmlElement {
    tag: string;
    attributes: Array<HtmlAttribute>;
    childrens: Array<HtmlElement>;
    parent: HtmlElement;
    text: string;
...

references.ts

/// <reference path="Scripts/typings/node/node.d.ts" />
/// <reference path="Classes/HtmlElement.ts" />

如果没有组合选项进行编译,则这是node.js窗口的输出:

debugger listening on port 5858

C:\Zdisk\Projets\14 08 - QCM\NodeJsTypeScript1\ServerApp\server.js:5
var html = new HtmlElement('html');
               ^
ReferenceError: HtmlElement is not defined
    at Object.<anonymous     (C:\Projects\NodeJsTypeScript1\Server
App\server.js:5:16)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain [as _onTimeout] (module.js:497:10)
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
Press any key to continue...

如果我使用combine选项,则不会发生任何事情,因为生成的文件只包含类声明。

2 个答案:

答案 0 :(得分:0)

在&#34;主文件的顶部&#34; (应该是&#34; server.ts&#34; - 一个TypeScript文件 - 不是&#34; server.js&#34;如你所提到的),你应该引用你的&#34; references.ts&#34;文件,它包含对所有其他TypeScript文件的引用:

//
//server.ts

///<reference path='./references.ts' />

//Program Code...

在一个ASP.NET项目中,有一个&#34; TypeScript Build&#34;项目设置的一部分,您可以在其中选择&#34;将JavaScript输出合并到文件&#34;并且,你将&#34; server.js&#34;在那里。

不幸的是,看起来NTVS家伙并没有在他们自己的项目设置中放置任何类似的功能,因此您必须实施自己的预构建过程才能使其在该环境中工作,直到他们提供一些正式的支持方式。

作为替代方法,您可以使用BeforeBuild步骤编译server.js文件。您需要手动编辑.proj文件(或.njsproj文件)并在最后一行(即项目文件中的倒数第二行)之前放置如下所示的内容:

<Target Name="BeforeBuild">
    <Exec Command="tsc.exe --module CommonJS --sourcemap --target ES5 --out server.js <ReferencedFile1> <...>" />
</Target>

Where&#34; ReferencedFile1&#34;等等是您尝试包含在最终server.js文件中的文件。您应该查看正常构建的输出,以查看通常传递给tsc.exe的参数。

答案 1 :(得分:0)

“将Javascript输出合并到文件中”选项对包含导入指令的文件不起作用。

您可以替换

import http = require('http');

通过

var http = require('http');

然后将整合server.ts,一切正常。

您现在可以为每个类创建一个文件,并使用

实现这些文件

var instance = new MyClass();

在我看来,这是一种更方便的语法。