命名空间已定义,尽管从未被导入
Namespace is defined despite never being imported
具有 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();
}
}
我希望发生的事情是在尝试引用 "foo" 时出现错误,因为我没有明确导入它或在任何地方定义它。然而,这编译成功。
根据 TypeScript 2.0 Handbook,使用 export as namespace 声明导出的命名空间只有在您编写脚本时才可用,它们定义为 "a file with no imports or exports"。但是在上面的例子中,我有一个导入和两个导出,所以我认为它不算脚本?
因此,为什么我可以从我的代码中引用 "foo"?
这是用 TypeScript 2.2 编译的
您只能在 type 职位中引用 foo
而没有 import
。尝试在 value 位置使用 foo
将引发错误。
这是因为 TS 不想强迫你写一个 import
只是为了将类型信息放入范围,因为 import
s 有你可能不想要的运行时副作用。
具有 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();
}
}
我希望发生的事情是在尝试引用 "foo" 时出现错误,因为我没有明确导入它或在任何地方定义它。然而,这编译成功。
根据 TypeScript 2.0 Handbook,使用 export as namespace 声明导出的命名空间只有在您编写脚本时才可用,它们定义为 "a file with no imports or exports"。但是在上面的例子中,我有一个导入和两个导出,所以我认为它不算脚本?
因此,为什么我可以从我的代码中引用 "foo"?
这是用 TypeScript 2.2 编译的
您只能在 type 职位中引用 foo
而没有 import
。尝试在 value 位置使用 foo
将引发错误。
这是因为 TS 不想强迫你写一个 import
只是为了将类型信息放入范围,因为 import
s 有你可能不想要的运行时副作用。