假设我有以下文件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'。
答案 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中外部模块的一个关键特性是两个不同的 外部模块永远不会为同一范围提供名称。 因为外部模块的使用者决定分配什么名称 它,没有必要主动包装出口符号 命名空间。
重申为什么你不应该尝试命名外部模块 内容,命名空间的一般思想是提供逻辑 对结构进行分组并防止名称冲突。因为 外部模块文件本身已经是一个逻辑分组,它的 顶级名称由导入它的代码定义,它是 不必为导出的对象使用额外的模块层。