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 中使用namespace
s
@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 Something
或 export class|interface Something
导出为“模块”中的命名导出
你只想导入那个,使用
import Something from "module"
您想要导入从命名空间mod
下的“模块”导出的所有内容
import * as mod from "module
然后使用const c:mod.Something = whatever
导出
见上面的import
s
export = something
形式已弃用,取而代之的是新的 ES6 样式语法。它主要出现在定义文件中,以表达 js 库导出单个函数/对象的事实,例如module.exports=something
.
你应该尝试使用什么
使用 ES6 样式语法并避免 default
导出:它们的优点是可以使用不同的名称导入,但
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