Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript-了解导出/导入_Typescript - Fatal编程技术网

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方式。旧的TypeScript
module
(现在称为
namespace
)语法是避免全局范围内名称冲突的一种方法。新的JavaScript(和TypeScript)模块编写方式是使用
import
export
语法

因此,是的,现在您应该
导出类CoordinardeModel
,在这种情况下,其他文件将需要
从文件中导入它,而不是依赖于它处于全局范围。在大多数情况下,您不需要
名称空间
(您编写的
模块鼠标
,也可以使用最新语法编写为
名称空间鼠标
,以消除ES6模块的歧义)。你可以阅读更多关于