39

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

我的设置是:

  • 节点JS
  • 打字稿中的一切
  • 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。它甚至值得使用吗?

问题的清单不胜枚举,但我确信一旦回答了上述一些问题,我就可以回答其余的问题。

谢谢你,很抱歉这样一个笼统的问题,但我的挫败感刚刚达到顶峰......

4

1 回答 1

18

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

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

TL;博士; : 使用 TS 1.5 中引入的 'es6 style' 语法

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

总的来说,我建议阅读这本出色的手册,它将为您的大多数问题提供答案

导入

从默认导出

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

利用

import Something from "module"

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

从命名导出

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

你只想导入那个,使用

import {Something} from "module"    

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

import * as mod from "module

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

导出

import上文

该表单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 等等,前两个是免费的,第三个甚至可以为您管理导入。

于 2016-02-17T12:01:47.340 回答