Typescript 命名空间是定义的,尽管从未导入
带有导出为命名空间声明的库或键入似乎会自动污染代码的命名空间,尽管我从未导入它们 例如:Typescript 命名空间是定义的,尽管从未导入,typescript,typescript2.0,Typescript,Typescript2.0,带有导出为命名空间声明的库或键入似乎会自动污染代码的命名空间,尽管我从未导入它们 例如: 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(); } } 我期望发生的是,当我尝试
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();
}
}
我期望发生的是,当我尝试引用foo时会出现一个错误,因为我没有在任何地方显式地导入或定义它。但是,这项工作编译成功
根据,使用“导出为命名空间”声明导出的命名空间应仅在编写脚本时可用,脚本将脚本定义为没有导入或导出的文件。但是在上面的例子中,我有一个导入和两个导出,所以我不认为它算作脚本
因此,为什么我能够从代码中引用foo
这是用TypeScript 2.2编译的,您只允许在不导入的情况下在类型位置引用foo。尝试在值位置使用foo将引发错误
这是因为TS不想强迫您仅为将类型信息写入范围而编写导入,因为导入会产生运行时的副作用,而您可能不希望这些副作用。所以导入是不必要的,例如,如果您只想用类型修饰函数的参数?在这种情况下,假设我要删除导出为命名空间声明,那么如果测试接口是在一个declare模块范围内导出的,我如何在没有导入的情况下引用它呢?另外:TypeScript中模块的一个关键特性是两个不同的模块永远不会为同一个范围提供名称。[…]模块的使用者决定从哪个名称分配它:这个示例是否可能违反这一点?