导入的类不会出现在d.ts文件中

时间:2014-07-31 08:43:37

标签: typescript

这与此问题有关:Can I import a TypeScript class from my own module to global?

我制作了一个模块,我希望将一个类暴露给全局范围。

module Foo {
    export class Bar {
        x: number
    }

    /* Some more interfaces and classes to be used only in this module */
}

首先,我创建了一个接口并定义了一个新变量来实现这一目标。

interface Bar extends Foo.Bar {
}
var Bar = Foo.Bar;

生成的JavaScript将我的Bar作为变量。

var Foo;
(function (Foo) {
    var Bar = (function () {
        function Bar() {
        }
        return Bar;
    })();
    Foo.Bar = Bar;
})(Foo || (Foo = {}));

var Bar = Foo.Bar;
//# sourceMappingURL=app.js.map

d.ts文件包含我的全局Bar接口和变量。

declare module Foo {
    class Bar {
        public x: number;
    }
}
interface Bar extends Foo.Bar {
}
declare var Bar: typeof Foo.Bar;

然后,我注意到我可以简单地使用import来公开我的课程,我就这样做了。

import Bar = Foo.Bar;

生成的JavaScript文件完全相同。

var Foo;
(function (Foo) {
    var Bar = (function () {
        function Bar() {
        }
        return Bar;
    })();
    Foo.Bar = Bar;
})(Foo || (Foo = {}));
var Bar = Foo.Bar;
//# sourceMappingURL=app.js.map

但是,我的d.ts文件现在不包含有关全局条的任何信息。

declare module Foo {
    class Bar {
        public x: number;
    }
}

这是预期的结果吗?我认为这会导致错误,因为当我在其他项目中包含JavaScript文件和d.ts文件时,它会允许声明具有相同名称的变量。

2 个答案:

答案 0 :(得分:1)

这是当前编译器中的一个错误,新的编译器似乎修复了这个问题。请参阅:https://github.com/Microsoft/TypeScript/issues/346

更正声明:

declare module Foo {
    class Bar {
        x: number;
    }
}
import Bar = Foo.Bar;

答案 1 :(得分:0)

使用import语句时,编译器会假定该定义位于其他位置。

例如,如果您将fileA.ts中的内容导入fileB.ts,则生成的fileA.d.ts已包含声明,如果包含此声明,则会与fileB.d.ts冲突声明。

所以我会说这种行为是故意的。