node.js的Typescript给出“不是构造函数”错误

时间:2017-07-29 19:22:34

标签: node.js visual-studio typescript

我有一个带有两个打字稿文件的node.js应用程序。 matchmanager.ts定义为 -

namespace LobbyService
{
    export class MatchManager 
    {
    constructor() { /*code*/ }
    }
}

和main.ts定义为

namespace LobbyService
{
    let matchManager: MatchManager = new MatchManager() ;
    /* code */
}

我设置visual studio将文件输出到名为lobbyservice.js

的单个JS文件中

但是,当我输入

node lobbyservice.js 

我收到以下错误 -

TypeError: LobbyService.MatchManager is not a constructor

生成的文件具有此输出 -

var LobbyService;
(function (LobbyService) {
    var matchManager = new LobbyService.MatchManager();
})(LobbyService || (LobbyService = {}));
var LobbyService;
(function (LobbyService) {
    var MatchManager = (function () {
        function MatchManager() {
            console.log("created");
        }
        return MatchManager;
    }());
    LobbyService.MatchManager = MatchManager;
})(LobbyService || (LobbyService = {}));

这之前有用,但由于一些奇怪的原因,它现在不是。有什么想法吗?

更新 - 我设法获得了一个有效的lobbyservice.js版本。出于某些奇怪的原因,Visual studio将文件的一个版本转换为上面的一个版本,并将其中的一个转换为 -

var LobbyService;
(function (LobbyService) {
    var MatchManager = (function () {
        function MatchManager() {
            console.log("created");
        }
        return MatchManager;
    }());
    LobbyService.MatchManager = MatchManager;
})(LobbyService || (LobbyService = {}));
var LobbyService;
(function (LobbyService) {
    var matchManager = new LobbyService.MatchManager();
})(LobbyService || (LobbyService = {}));
//# sourceMappingURL=lobby.js.map

不知道为什么我得到两个不同的输出,如同相同的源代码。两个项目都具有相同的模块属性“none”

1 个答案:

答案 0 :(得分:0)

因此,用户Elliott强调,确实它是一个知道打字稿编译怪癖,其中输出javascript文件的顺序会产生问题。

要解决这个问题,我必须添加

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

在我使用MatchManager类的打字稿文件上,即使它们位于相同的命名空间并编译好。这迫使typescript编译器创建一个可行的javascript输出。