在多个文件

时间:2016-08-31 23:57:17

标签: node.js typescript

我目前正在开发我的第一个Typescript项目。在浏览完官方文档并观看一些课程(egghead)之后,我认为是时候编写真正的代码 - 而不仅仅是样本。

我正在使用:

  • typescript @ rc(~2.0.2)
  • Visual Studio Code(~1.4.0)
  • Windows 10

所以我正在研究一个节点模块。我的问题是代码结构。

以下是我的项目的样子:

 src/
|____ core/
|    |____ core.ts
|    |____ components.ts
|    |____ systems.ts
|____ input/
|    |____ input.system.ts
|    |____ keyboard.ts
|____ app.ts

以下是每个文件的示例:

  • core.ts
/// <reference path="../core/components.ts" />

namespace Core {

    export interface IEntity {
        x: number
        y: number
        components: [Components.IComponent]
        update(dt: number): void
    }

    export class Entity implements IEntity {
        x: number
        y: number
        components: [Components.IComponent]
        update(dt: number): void{
            // do something with the coordinates
        }
    }
}
  • components.ts
namespace Components{
    export interface IComponent {
        update(dt: number): void
        // some other stuff here...
    }
}
  • systems.ts
namespace Systems{

    export interface ISystem{
        update(dt: number): void
        // some other stuff here...
    }

}
  • input.system.ts
/// <reference path="../core/systems.ts" />

namespace Systems{

    export class InputSystem implements ISystem{
        update(dt: number): void{
            // do something here
        }
        // some other stuff here...
    }

}
  • keyboard.ts
/// <reference path="../core/components.ts" />

namespace Components{
    export class Keyboard implements IComponent{
        update(dt: number): void{
            // do something here - Catch key up / down
        }
        // some other stuff here...
    }
}
  • app.ts
/// <reference path="./core/core.ts" />
/// <reference path="./core/components.ts" />
/// <reference path="./core/systems.ts" />

/// <reference path="./input/input.system.ts" />
/// <reference path="./input/keyboard.ts" />

export = {Core, Components, Systems}

我想要做的是拥有3个主要名称空间Core,Components和Systems。然后,如果在另一个项目中导入了该模块,我们可以执行以下操作:

  • other.module.ts
// load module from node

import * as mymodule from "mymodule"

module A {
    class A extends mymodule.Core.Entity{
        constructor() {
            this.components.push(new mymodule.Components.Keyboard());
        }
    }

    export function main(): void{
       var systems: [mymodule.Systems.ISystem];

       systems.push(new mymodule.Systems.InputSystem());
       // other systems could be pushed Here

       for(var system in systems){
           system.update(0.5);
       }
    }
}

我得到的错误是在app.ts中,所有命名空间编译器都说:

cannot re export name that is not define

我在做什么有问题吗?

我还想知道我是否应该在app.ts中使用默认导出?像:

export default {Core, Components, Systems}

导入我的模块时会有帮助吗?

谢谢, 编

1 个答案:

答案 0 :(得分:0)

不确定我的问题是否足够明确。我找到了一个解决方案,并希望你的意见。

所以,我从我的文件中删除了所有名称空间。这意味着现在我的所有文件都是模块。

然后在我的解决方案的根目录中,我创建了三个文件:

  • _core.ts
export * from "./core/core"
  • _components.ts
export * from "./core/components" 
export * from "./input/keyboard"
  • _systems.ts
export * from "./core/systems" 
export * from "./input/input.controller"

现在在我的app.ts中,我可以简单地导入这些新文件。

import * as Core from "./_core"
import * as Components from "./_components.ts"
import * as Systems from "._/systems.ts"

export = {Core, Components, Systems}
你怎么看?这样做有什么潜在的问题吗?

谢谢, 编