Typescript内部模块 - 无法在同一模块

时间:2015-05-20 14:23:20

标签: javascript compilation compiler-errors typescript tsc

嗨!

首先,对不起,如果之前有人询问,我尝试了一些谷歌搜索,但无法找到任何东西(至少没有任何我认为是同样的问题)。我是打字稿的新手,所以还是要掌握!

我正在制作一个小游戏作为一个项目来刷新我的JavaScript,并决定使用Typescript,因为它似乎非常适合模块化我的应用程序。它全部在节点服务器上运行 - 如果需要,我可以提供版本号!

我有两个文件, player.ts scene.ts ,这些都属于同一个模块(因为它们是我程序的一部分,但我想要为了模块化而将它们分开):

player.ts

module TheGame {
    export class Player {
        name: string;
        constructor(name: string) { 
            this.name = name;
        }
    }
}

scene.ts

///<reference path="player.ts"/>
///<reference path="../typings/threejs/three.d.ts"/>
import jquery = require("three");

module TheGame {
    export class Scene {
        player: any;
        constructor() {
            this.player = new Player('test');
        }
        //Use of Three throughout file
    }
}

这两个文件都在同一个文件夹中,当我尝试用以下文件编译它们时:

tsc player.ts scene.ts --module commonjs

我收到错误:

testscene.ts(10,22): error TS2095: Could not find symbol 'Player'.

如果删除引用并导入为Three,则编译良好,但显然我需要在类中使用Three。 (在播放器类中也需要三个,可能更晚一些)看起来它实际上编译了JS文件,即使出现错误,我也不确定原因。

  • 我不明白这是如何运作的?

  • 使用外部模块和内部是否有一些限制 模块?

  • 有没有办法导入我的应用程序的所有外部类 需要(三,socket.io等)在它自己的TS文件中才能完成这项工作, 如果这是一个解决方案?

提前致谢!

ANSWERED:

解决方案是,使用commonJS,您需要显式导出和导入,并且使用模块并不真正有意义(感谢@ssube和@BGR解决方案)。

工作代码:

player.ts

export class Player {
    name: string;
    constructor(name: string) { 
        this.name = name;
    }
}

export = Player;

scene.ts

///<reference path="../typings/threejs/three.d.ts"/>
import jquery = require("three");
import Player = require("./player");

class Scene {
    player: Player;
    constructor() {
        this.player = new Player('test');
    }
    //Use of Three throughout file
}

export = Scene;

2 个答案:

答案 0 :(得分:3)

如果你想使用commonjs(我认为你应该)你需要明确导出和导入试试

<强> player.ts

class Player {
    name: string;
    constructor(name: string) { 
        this.name = name;
    }
}

export = Player

<强> scene.ts

///<reference path="../typings/threejs/three.d.ts"/>
import jquery = require("three");  //I guess 'jquery' is a typo
import Player = require('./Player')

class Scene {
    player: any; //any -> Player ?
    constructor() {
        this.player = new Player('test');
    }
    //Use of Three throughout file
}

export = Scene //if this makes sense
  • 使用包装器modules(如TheGame)在使用commonJS(事情是孤立的)时没有意义

  • 您无需引用.ts文件

答案 1 :(得分:1)

由于您已将它们定义为模块,Player即使它们位于同一文件中也不会显示TheGame。这就是模块的目的和力量。

您需要import Player player.ts scene.ts内的Player才能在该范围内显示。根据您的输出,这可能会转换为AMD或CommonJS要求。

引用该文件使编译意识到定义并允许验证,但实际上并没有将这些符号拉入当前作用域并使它们可用。

我建议将///<reference path="player.ts"/> ///<reference path="../typings/threejs/three.d.ts"/> import jquery = require("three"); import Player = require("player"); 从其文件中导出为默认导出,以简化导入:

class Class1 A {
    int Id;
    IEnumerable<Class2> B;
}

class Class2 B {
    string Title;
}