Typescript-了解导出/导入
我正在学习打字。我读过关于名称空间和导入的文章 在我自己的项目中,我创建了一些类。由于这是我的第一个项目,我忘了在其中一些文件上添加Typescript-了解导出/导入,typescript,Typescript,我正在学习打字。我读过关于名称空间和导入的文章 在我自己的项目中,我创建了一些类。由于这是我的第一个项目,我忘了在其中一些文件上添加export关键字,但我注意到它们仍然可以在其他文件中访问,而无需导入它们。我还注意到,带有import的类需要是export/import,以便在其他地方使用 为什么我可以这样做?这样可以吗?什么时候必须使用导出,什么时候不是 我想我应该总是导出/导入我的类和模块,但是没有它们,代码就可以工作了 class CoordinateModel { public
export
关键字,但我注意到它们仍然可以在其他文件中访问,而无需导入它们。我还注意到,带有import的类需要是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;
好的,只有当您从TypeScript中导出某些内容时,TypeScript中的文件才是模块。一旦这样做,只有从该文件导出的内容才可访问,并且必须导入它们
这就是您在另一个文件中所做的(我将其称为module.ts
,因为我不知道它的名称),导出鼠标。如果您将另一个ts
文件添加到项目中并执行以下操作
let a = getMousePosition(null);
您将得到一个错误,因为未定义getMousePosition
。在这种情况下,您需要在文件开头执行以下操作:
import { getMousePosition } from "./module";
当然,在导出模块时,在module.ts
中定义模块在您的情况下意义不大。您可以很容易地定义名称空间。导出的内容是鼠标
,而不是鼠标
本身
如果删除export=Mouse
行,则需要在另一个文件中执行以下操作:
let a = Mouse.getMousePosition(...);
而且您不需要导入。如果您的文件没有顶级import
或export
语句,那么它就在全局范围内,这意味着所有顶级项都随处可见,而无需导入任何内容
这基本上是ES6模块出现之前的老JavaScript方式。旧的TypeScriptmodule
(现在称为namespace
)语法是避免全局范围内名称冲突的一种方法。新的JavaScript(和TypeScript)模块编写方式是使用import
和export
语法
因此,是的,现在您应该导出类CoordinardeModel
,在这种情况下,其他文件将需要从文件中导入它,而不是依赖于它处于全局范围。在大多数情况下,您不需要名称空间
(您编写的模块鼠标
,也可以使用最新语法编写为名称空间鼠标
,以消除ES6模块的歧义)。你可以阅读更多关于