我正在编写一个外部模块(使用AMD),只需要导出一个类。我只想将其导入为import MyClass = require('./MyClass')
,因此在MyClass模块中我使用“export =”语法:
export = class MyClass {
// ...
}
这样编译没有错误,并生成合理的JS代码:
define(["require", "exports"], function (require, exports) {
return (function () {
function MyClass() { /* ... */ }
return MyClass;
})();
});
接下来,我尝试导入它:
import MyClass = require('./MyClass');
var my: MyClass = new MyClass();
编译这个给我错误“var my:MyClass”:“TS2304:找不到名字'MyClass'”。
但是,当我将模块导出更改为:
时class MyClass {
// ...
}
export = MyClass;
一切正常,但生成的JS代码似乎几乎相同:
define(["require", "exports"], function (require, exports) {
var MyClass = (function () {
function MyClass() { /* ... */ }
return MyClass;
})();
return MyClass;
});
据我所知,唯一的区别是,它在返回之前使用临时变量,这在此闭包之外没有任何影响。
那么有什么区别以及为什么我在第一种情况下会出现TS2304错误?这两种情况不一样吗?
答案 0 :(得分:0)
这两种情况不一样吗?
他们应该。请在此处报告错误:https://github.com/Microsoft/TypeScript/issues
答案 1 :(得分:0)
以下是我在GitHub上TypeScript's issues给出的答案。 积分转到Vladimir Matveev。
这是设计的。课堂宣言
MyClass
具有两者的含义 类型和价值。至于类表达式,如果它有名称,那么这个名称 被添加到类型\ value声明空间里面类表达式。 在外面,您可以将类表达式绑定到变量或参数 但这种约束只具有价值意义。结果:var x = class A { f() { let a: A; // legal - A has type meaning a = new A(); // legal = A has value meaning } } let y1: A; // illegal - A is not visible here let y2: x; // illegal - variable declaration adds name `x` only to value declaration space let y3 = new x(); // legal - x has value meaning