2

你好!

首先,抱歉,如果之前有人问过这个问题,我尝试了一些谷歌搜索,但找不到任何东西(至少没有我认为是同样的问题)。我是 Typescript 的新手,所以仍然要掌握!

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

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

播放器.ts

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

场景.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 文件,即使有错误,我不知道为什么。

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

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

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

提前致谢!

回答:

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

工作代码:

播放器.ts

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

export = Player;

场景.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;
4

2 回答 2

3

如果你想使用 commonjs(我认为你应该),你需要显式地导出和导入 try

播放器.ts

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

export = Player

场景.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
  • 使用 commonJS 时使用 wrapper modules(like TheGame) 并没有真正意义(事物是孤立的)

  • 您不需要引用 .ts 文件

于 2015-05-20T14:34:57.677 回答
1

由于您已将它们定义为模块,因此即使它们在同一个文件中Player也不可见。TheGame这就是模块的目的和力量。

您需要import Playerplayer.ts内部scene.ts使其在该范围内可见。根据您的输出,这可能会转化为 AMD 或 CommonJS 要求。

引用该文件使编译知道定义并允许验证,但实际上并没有将这些符号拉入当前范围并使它们可用。

我建议Player从其文件中进行默认导出以简化您的导入:

///<reference path="player.ts"/>
///<reference path="../typings/threejs/three.d.ts"/>
import jquery = require("three");
import Player = require("player");
于 2015-05-20T14:35:24.930 回答