NodeJS/Typescript 导出/导入的正确解释?

Posted

技术标签:

【中文标题】NodeJS/Typescript 导出/导入的正确解释?【英文标题】:Proper explanation for NodeJS/Typescript Export / Import? 【发布时间】: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)时,情况并非如此。但这只是我的看法。 【参考方案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 Somethingexport 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。它可以通过许多微妙的方式增加复杂性,而且不值得它提供的便利。

以上是关于NodeJS/Typescript 导出/导入的正确解释?的主要内容,如果未能解决你的问题,请参考以下文章

使用nodejs typescript将数据插入postgreSQL

通过“no-var-requires”ESLint 规则,导入没有声明文件的模块

Axure RP文件导入导出方法

sqoop导入导出常见问题

导入表与导出表(1)

EasyPoi的导入和导出功能