“export = class”

时间:2015-10-22 14:16:27

标签: typescript export typescript1.6

我正在编写一个外部模块(使用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错误?这两种情况不一样吗?

2 个答案:

答案 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