扩展- 根据一些评论提供更多细节
错误
错误 TS2306:文件“test.ts”不是module。
来自这里描述的事实http://exploringjs.com/es6/ch_modules.html
17. module
本章解释了 ECMAScript 6 中的内置module是如何工作的。
17.1 概述
在 ECMAScript 6 中,module存储在文件中。每个文件正好有一个module,每个module只有一个文件。您有两种从module导出内容的方法。这两种方式可以混合使用,但通常最好分开使用。
17.1.1 多命名导出
可以有多个命名导出:
//------ lib.js ------
export const sqrt = Math.sqrt;
export function square(x) {
return x * x;
}
export function diag(x, y) {
return sqrt(square(x) + square(y));
}
...
17.1.2 单个默认导出
可以有一个默认导出。例如,一个函数:
//------ myFunc.js ------
export default function () { ··· } // no semicolon!
基于以上,我们需要export
, 作为test.js文件的一部分。让我们像这样调整它的内容:
// test.js - exporting es6
export module App {
export class SomeClass {
getName(): string {
return 'name';
}
}
export class OtherClass {
getName(): string {
return 'name';
}
}
}
现在我们可以通过以下三种方式导入它:
import * as app1 from "./test";
import app2 = require("./test");
import {App} from "./test";
我们可以像这样消费进口的东西:
var a1: app1.App.SomeClass = new app1.App.SomeClass();
var a2: app1.App.OtherClass = new app1.App.OtherClass();
var b1: app2.App.SomeClass = new app2.App.SomeClass();
var b2: app2.App.OtherClass = new app2.App.OtherClass();
var c1: App.SomeClass = new App.SomeClass();
var c2: App.OtherClass = new App.OtherClass();
并调用该方法以查看它的运行情况:
console.log(a1.getName())
console.log(a2.getName())
console.log(b1.getName())
console.log(b2.getName())
console.log(c1.getName())
console.log(c2.getName())
原始部分试图帮助减少名称空间使用的复杂性
原始部分:
我真的强烈建议检查这个问答:
让我引用第一句话:
不要在外部module中使用“命名空间”。
不要这样做。
严重地。停止。
...
在这种情况下,我们只是不需要module
在test.ts
. 这可能是它的内容调整test.ts
:
export class SomeClass
{
getName(): string
{
return 'name';
}
}
在这里阅读更多
在前面的示例中,当我们使用每个验证器时,每个module仅导出一个值。在这种情况下,通过它们的限定名称使用这些符号是很麻烦的,而单个标识符也可以这样做。
的export =
语法指定该从module中导出的单个对象。这可以是类、接口、module、函数或枚举。导入时,导出的符号被直接使用,没有任何名称限定。
我们稍后可以像这样使用它:
import App = require('./test');
var sc: App.SomeClass = new App.SomeClass();
sc.getName();
在此处阅读更多信息:
在某些情况下,您可能只想在某些条件下加载module。在 TypeScript 中,我们可以使用下面显示的模式来实现这个和其他高级加载场景,以直接调用module加载器而不会失去类型安全性。
编译器检测每个module是否在发出的 JavaScript 中使用。对于仅用作类型系统一部分的module,不会发出 require 调用。剔除未使用的引用是一种很好的性能优化,并且还允许选择性加载这些module。
该模式的核心思想是 import id = require('...') 语句让我们可以访问外部module公开的类型。module加载器是动态调用的(通过 require),如下面的 if 块所示。这利用了引用剔除优化,以便仅在需要时加载module。为了让这个模式起作用,重要的是通过 import 定义的符号仅用于类型位置(即永远不会在将被发送到 JavaScript 的位置中)。