打字稿 - 了解导出/导入

时间:2018-04-25 15:36:47

标签: typescript

我正在学习打字稿。我读过有关命名空间和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;

2 个答案:

答案 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)

如果您的文件没有顶级importexport语句,那么它在全局范围内,这意味着所有顶级项目都可以在任何地方看到,而无需import任何内容。

在ES6模块出现之前,这基本上是旧的JavaScript处理方式。旧的TypeScript module(现在称为namespace)语法是一种避免全局范围内名称冲突的方法。新的JavaScript(和TypeScript)编写模块的方式是使用importexport语法。

所以是的,现在你应该 export class CoordinateModel,在这种情况下,其他文件需要import来自文件,而不是依赖它在全局范围内。在大多数情况下,您不需要namespace(您编写为module Mouse的内容,也可以使用最新语法编写为namespace Mouse,以消除ES6模块的歧义)。您可以阅读有关Namespaces and Modules in the docs的更多信息。