打字稿中的模块关键字是啥意思?
Posted
技术标签:
【中文标题】打字稿中的模块关键字是啥意思?【英文标题】:What does the module keyword mean in typescript?打字稿中的模块关键字是什么意思? 【发布时间】:2016-02-18 13:29:54 【问题描述】:我试图弄清楚一些与 ES6 模块相关的事情。如何将命名空间与 angular 和 typescript 一起使用。
假设以下代码表示一个角度指令。有谁知道module
关键字的含义以及如何访问其他文件中的 MyClass。
// file1.ts
module NSpace.Space
export class MyClass
constructor() ...
...
我尝试过使用并重新导出来访问另一个文件,但是
// file2.ts
import MyClass from 'file1';
export MyClass
我收到此错误:error TS2306: File 'file.ts' is not a module
我的问题是:
为什么我会得到这个?module
关键字是什么?
我们是只基于目录结构创建ES6模块还是可以
我们实际上使用这个符号吗? module Space.Space1.Space2 ...
从我目前的阅读和体验来看,似乎 ES6 模块是基于文件结构定义的,这就是我收到此错误的原因。
我还没有写过这段代码,这就是我问的原因。提及我正在使用 System.JS 进行导入可能会很有用。
【问题讨论】:
module
关键字是 specific to Typescript。它不是 ES6 的特性,它假定所有使用 import
加载的文件默认都是模块
【参考方案1】:
TypeScript 中的 module
关键字引起了一些混乱,因此将其重命名为 namespace
。
不过,除了使用命名空间之外,您还可以按文件/文件系统组织代码(这意味着实际文件位置将与感知的命名空间相匹配。这就是“外部模块”(TypeScript)的工作方式 - 以及 ECMAScript 2015 的工作方式模块工作。
因此,通过快速调整,您将拥有:
// file1.ts
export class MyClass
constructor() ...
...
然后这将起作用:
import MyClass from 'file1';
如果您以 ES6 为目标进行编译,您会注意到这行代码不需要翻译,它符合模块导入的标准。如果您以 ES5 或更低版本为目标,TypeScript 将为您转换此语句(您可以使用 --module
标志选择转换。
我倾向于使用 UMD 编译选项,这意味着输出将在 Web 浏览器(使用 RequireJS)或 Node.js 上工作。 System JS 目前实际上正在获得很多关注,因此您可能也需要考虑这一点。最终,浏览器将简单地原生支持模块加载。
【讨论】:
这正是我对模块加载的理解。实际上,在模块定义中同时使用这两种方式是没有意义的。 错字? “需要翻译”可能应该是“不需要翻译” 从 TypeScript 3.5.3(2019 年 8 月)开始,module
关键字仍然存在,但输出与 namespace
完全相同。但declare module "name"
不同,它用于声明 npm 模块的类型定义。以上是关于打字稿中的模块关键字是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章