我正在学习打字稿。我读过有关命名空间和import
/ export
的文章。
在我自己的项目中,我创建了一些类。由于这是我的第一个项目,我忘了在其中一些项目上放置export
关键字,但我注意到它们仍然可以在其他文件中访问,而无需导入它们。我还注意到一个带导入的类需要导出/导入才能在其他地方使用。
为什么我能这样做?这样做可以吗?什么时候强制使用export
,什么时候不使用?
我认为我应该始终export
/ import
我的课程和模块,但代码在没有它们的情况下正常工作。
class CoordinateModel {
public x: number;
public y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
在另一个文件中,我可以使用它
import * as d3 from "d3";
module Mouse {
export function getMousePosition(container:d3.ContainerElement): CoordinateModel {
var m = d3.mouse(container);
return new CoordinateModel(m[0], m[1]);
}
export function showMousePositionInElement(elementClassName: string, container: d3.ContainerElement) {
var m = Mouse.getMousePosition(container);
d3.select("." + elementClassName).html(m.x + ", " + m.y);
}
}
export = Mouse;
答案 0 :(得分:0)
嗯,只有从中导出内容时,TypeScript中的文件才是模块。一旦这样做,只能访问从该文件导出的内容,并且必须导入它们。
这就是你在另一个文件中所做的事情(我称之为module.ts
因为我不知道名字),导出Mouse
。如果您将另一个ts
文件添加到项目中并执行
let a = getMousePosition(null);
您将收到错误,因为未定义getMousePosition
。在这种情况下,你需要在文件的开头:
import { getMousePosition } from "./module";
当然,在module.ts
中定义一个模块意味着你的情况并不多,因为你正在导出它。您可以轻松定义命名空间。您导出Mouse
的内容,而不是Mouse
本身。
如果您删除了export = Mouse
行,那么您需要在另一个文件中删除:
let a = Mouse.getMousePosition(...);
你不需要导入。
答案 1 :(得分:0)
如果您的文件没有顶级import
或export
语句,那么它在全局范围内,这意味着所有顶级项目都可以在任何地方看到,而无需import
任何内容。
在ES6模块出现之前,这基本上是旧的JavaScript处理方式。旧的TypeScript module
(现在称为namespace
)语法是一种避免全局范围内名称冲突的方法。新的JavaScript(和TypeScript)编写模块的方式是使用import
和export
语法。
所以是的,现在你应该 export class CoordinateModel
,在这种情况下,其他文件需要import
来自文件,而不是依赖它在全局范围内。在大多数情况下,您不需要namespace
(您编写为module Mouse
的内容,也可以使用最新语法编写为namespace Mouse
,以消除ES6模块的歧义)。您可以阅读有关Namespaces and Modules in the docs的更多信息。