如何使用AMD模块在plain js中创建typescript类的对象实例

时间:2014-05-15 18:18:58

标签: javascript requirejs typescript amd

假设我有以下文件tests.ts

module tests {

    export class Greeter
    {
        sayHello() {
            console.log("hello world");
        }
    }
}

并将其编译为AMD模块。我究竟如何在常规JavaScript(而不是typescript!)文件中创建Greeter的对象实例?

我想的是:

require(['tests', function(tests) {
    var greeter = new tests.Greeter();
    greeter.sayHello();
}

但这似乎不起作用 - 调试器显示我的测试是__proto__,但我找不到其中的成员'Greeter'。

1 个答案:

答案 0 :(得分:5)

您已忘记顶级export上的module关键字,因此顶级代码块实际上并未导出任何可见的外部模块。

另请参阅Modules in TypeScript" Needless Namespacing"缺陷:

  

如果您要将程序从内部模块转换为外部模块   模块,可以很容易地得到一个如下所示的文件:

shapes.ts

 export module Shapes {
     export class Triangle { /* ... */ }
     export class Square { /* ... */ } }
 }
  

此处的顶级模块Shapes包含Triangle和Square for no   原因。这对您模块的消费者来说是令人困惑和烦恼的:

shapeConsumer.ts

 import shapes = require('./shapes'); var t = new
 shapes.Shapes.Triangle(); // shapes.Shapes?
  

TypeScript中外部模块的一个关键特性是两个不同的   外部模块永远不会为同一范围提供名称。   因为外部模块的使用者决定分配什么名称   它,没有必要主动包装出口符号   命名空间。

     

重申为什么你不应该尝试命名外部模块   内容,命名空间的一般思想是提供逻辑   对结构进行分组并防止名称冲突。因为   外部模块文件本身已经是一个逻辑分组,它的   顶级名称由导入它的代码定义,它是   不必为导出的对象使用额外的模块层。