【问题标题】:Proper explanation for NodeJS/Typescript Export / Import?NodeJS/Typescript 导出/导入的正确解释?
【发布时间】:2016-05-29 02:23:00
【问题描述】:

有人可以解释一下使用 Typescript 在 NodeJS 中导出和导入是如何工作的吗?

我的设置是:

  • NodeJS
  • Typescript 中的所有内容
  • TSLint
  • 打字

我在搞乱导出/导入,而不是做一些正确的编码,这让我发疯,并且找不到任何关于它如何工作的正确解释。

导入

你能解释一下吗:

var module = require ("module");

import module = require("module");

import module from "module";

import {something} from "module";

import * as module from "module";

导出

你能解释一下吗

export = something;

export default something;

export interface|class something;

问题

  • 如何在不启动类的情况下正确导出/导入类
  • 如何正确导出/导入已启动的类(构造已运行)
  • 如何正确导出/导入类和接口
  • 如何正确导出/导入类和多个接口
  • 什么时候使用模块声明,它们有什么用,如果我尝试使用它们,为什么 tslint 会向我抛出错误。

我似乎找不到正确的导出和导入方法,所以我的 IDE 没有被红色覆盖,并且向我抛出了数百个错误。

一般问题

  • 有没有办法使用 nodejs/typescript/tslint 不出错?
  • TSLint 对我输入的几乎所有内容都大喊大叫...非常令人沮丧,因为对大多数错误的解释为 0。它甚至值得使用吗?

问题不胜枚举,但我敢肯定,一旦上面的一些问题得到了回答,我就可以继续回答其余的问题了。

感谢您提出这样一个笼统的问题,但我的挫败感刚刚达到顶峰......

【问题讨论】:

  • 是的,将您的 TypeScript 代码分成多个文件以解决分离问题目前与 blashphemy 相当。您需要在使用内部命名空间 (!) 时引用源文件以正确排序,或者需要将编译的代码限制为模块加载系统 (!!) 语法,以便编译的代码可以运行 (!!!)。我希望这将在 非常 不久的将来解决,因为目前 TypeScript 远不是“应用程序级 Javascript 开发”的一个不错的选择(没有冗长而痛苦的项目配置,是)。
  • @JohnWhite 拥有模块是一件好事,因此它们引入了 Javascript (ES6/2015)。多个命名导出可以在单个 TS 文件中重新组合。尽量避免在 Typescript 中使用namespaces
  • @BrunoGrieder 确实是这样,但当您(应该)能够将项目无缝编译成可执行资源(在本例中为 Javascript)时,情况并非如此。但这只是我的看法。

标签: node.js import typescript tslint


【解决方案1】:

同意,导入/导出语法令人困惑至少有两个原因:

  • commonjs 语法:var module = require ("module"); 有效,但这是 commonjs -> 没有类型
  • 它发生了变化:语法 import x = require('y') 现在在 TS 中已弃用

TL;DR;:使用 TS 1.5 中引入的“es6 样式”语法

我所知道的 TS 中关于导入/导出的“最佳”资源是 this

总的来说,我建议阅读此excellent handbook,它将为您的大部分问题提供答案

导入

从默认导出

Something 被导出为默认(单个)导出,即 ts/es6 中的 export default Something

使用

import Something from "module"

您实际上可以导入具有不同名称的默认导出。 import SomethingElse from 'module' 也可以使用

来自命名导出

Something 在 ts/es6 中使用 export {Something}export class|interface Something{} 导出为“模块”中的命名导出

你只想导入那个,使用

import {Something} from "module"    

您想要导入从命名空间mod 下的“模块”导出的所有内容

import * as mod from "module

然后使用const c:mod.Something = whatever

导出

见上面的imports

export = something 形式已弃用,取而代之的是新的 ES6 样式语法。它主要出现在定义文件中,以表达 js 库导出单个函数/对象的事实,例如module.exports=something.

你应该尝试使用什么

使用 ES6 样式语法并避免 default 导出:它们的优点是可以使用不同的名称导入,但

  • 默认导入无法重新导出,如果您正在编写库,这可能会出现问题
  • 重构时会迷惑很多 IDE(更不用说你自己了)
  • 一个命名的导出实际上可以在导入时在本地重命名,即import {Something as SomethingElse} from "module"

具体来说,导出需要导出的内容,具体导入

api.ts

export interface MyInterface {
}

export class MyClass {
}

main.ts

 import {MyInterface, MyClass} from './api'

起绒

有很多优秀的 IDE 可以提供出色的 linting:VSCode、Atom Typescript 和 Webstorm 等等,前两个是免费的,第三个甚至可以为您管理导入。

【讨论】:

  • 想补充一点,import foo from require('foo') 是一个重要的模式,并且一些模块还没有为 es6 更新。 CommonJS 后备将有所帮助。 :)
  • 我发现github.com/Microsoft/TypeScript/issues/2242#issue-60179656 也是一个非常有用的总结。我也同意暂时避免使用export default。它可以通过许多微妙的方式增加复杂性,而且不值得它提供的便利。
猜你喜欢
  • 2018-06-10
  • 2020-06-22
  • 1970-01-01
  • 2019-11-24
  • 2015-08-23
  • 2017-01-22
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多