【问题标题】:Namespace is defined despite never being imported命名空间被定义,尽管从未被导入
【发布时间】:2017-03-17 20:11:51
【问题描述】:

带有 export as namespace 声明的库或类型似乎会自动污染我的代码的命名空间,尽管我从未导入它们。

例如:

import * as bar from "exa";

export var t2 = (a:foo.Test) => { 
    console.log(a.doSomething());
}

export class Something {
    public test(c:foo.Test) {
        c.doSomething();
    }
}

Complete example on GitHub

当我尝试引用“foo”时,我期望会发生错误,因为我没有明确导入它或在任何地方定义它。但是,这编译成功。

根据TypeScript 2.0 Handbook,使用 export as namespace 声明导出的命名空间只有在您编写脚本时才可用,他们将其定义为 “没有导入的文件或出口”。但是在上面的示例中,我有一个导入和两个导出,所以我认为它不算是脚本?

因此,为什么我可以从我的代码中引用“foo”?

这是使用 TypeScript 2.2 编译的

【问题讨论】:

    标签: typescript typescript2.0


    【解决方案1】:

    您只能在没有importtype 位置引用foo。尝试在 value 位置使用 foo 会引发错误。

    这是因为 TS 不想强迫您编写 import 只是为了将类型信息纳入范围,因为 imports 具有您可能不想要的运行时副作用。

    【讨论】:

    • 因此不需要导入,例如,如果您只想用类型装饰函数的参数?在这种情况下,假设我要删除“导出为命名空间”声明,如果在“声明模块”范围内导出测试接口,我将如何在没有导入的情况下引用它?
    • 另外:“TypeScript 中模块的一个关键特性是两个不同的模块永远不会为同一个范围提供名称。[..] 模块的使用者决定为其分配什么名称”(来自typescriptlang.org/docs/handbook/namespaces-and-modules.html):这个例子是不是潜在地违反了这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多