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

Dyn*_*lon 0 javascript amd requirejs typescript

可以说我有以下文件tests.ts:

module tests {

    export class Greeter
    {
        sayHello() {
            console.log("hello world");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我想的是:

require(['tests', function(tests) {
    var greeter = new tests.Greeter();
    greeter.sayHello();
}
Run Code Online (Sandbox Code Playgroud)

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

Rya*_*ugh 5

您忘记了export顶层的关键字module,因此顶部代码块实际上并不会导出任何可见的外部模块.

另外,请参阅TypeScript中模块 "Needless Namespacing"陷阱:

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

shapes.ts

 export module Shapes {
     export class Triangle { /* ... */ }
     export class Square { /* ... */ } }
 }
Run Code Online (Sandbox Code Playgroud)

这里的顶级模块Shapes无缘无故地包装了Triangle和Square.这对您的模块的消费者来说是令人困惑和恼人的:

shapeConsumer.ts

 import shapes = require('./shapes'); var t = new
 shapes.Shapes.Triangle(); // shapes.Shapes?
Run Code Online (Sandbox Code Playgroud)

TypeScript中外部模块的一个关键特性是两个不同的外部模块永远不会为同一范围提供名称.因为外部模块的使用者决定分配它的名称,所以不需要主动地将命名空间中的导出符号包装起来.

为了重申您不应该尝试命名外部模块内容的原因,命名空间的一般概念是提供构造的逻辑分组并防止名称冲突.由于外部模块文件本身已经是逻辑分组,并且其顶级名称由导入它的代码定义,因此不必为导出的对象使用其他模块层.