-1

我正在编写一个只需要导出一个类的外部模块(使用 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 错误?两种情况不应该一样吗?

4

2 回答 2

0

两种情况不应该一样吗?

他们应该。请在这里报错:https ://github.com/Microsoft/TypeScript/issues

于 2015-10-22T23:01:46.187 回答
0

这是我在 GitHub 上的TypeScript 问题中得到的答案。归功于 Vladimir Matveev 。

这是设计使然。类的声明MyClass具有类型和值的含义。至于类表达式,如果它有名称,那么这个名称将被添加到类表达式的类型\值声明空间中。在外部,您可以将类表达式绑定到变量或参数,但此绑定仅具有值含义。作为结果:

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
于 2015-10-23T17:21:39.370 回答