如何设计出口的打字稿项目

时间:2018-01-12 02:21:27

标签: javascript node.js typescript npm

我很抱歉,因为我是js生态系统的新手。我在一个使用打字稿的地方工作,这很棒,因为它帮助我从静态语言的背景中走出来。但是,我仍然不了解包装/模块系统,特别是与打字稿定义相结合。

我正在编写一个模块,其中包含一堆描述Web服务API契约的接口,供客户端库和API服务本身使用。如果这是C#/ Java或者我会编写我的接口文件的东西,打包它,发布它就会被消费说

import GetWizardsResponse from StuffInc.Contract.Wizards

这就是我接触我的打字稿库的方式,所以我写了

export interface GetWizardsResponse {
    wizards: Wizard
    currentPage: number
    count: number
}

然后在ts.config"declaration": true tscWizards.d.ts之后我得到Wizards.jsnpm publish。当我import {GetWizardsResponse} from '@StuffInc/contracts/Wizards'时,我必须通过这样的方式来消费它:

import * as Express from 'express'

但是当我环顾四周时,更常见的是看到这样的导入:

import { Response, NextFunction } from 'express'

import { GetWizardsResponse } from '@StuffInc/contracts

所以我使用我的包看起来应该是这样的:

/wizards

这样我可以拥有/goblins/elvesindex.d.ts,但导入始终来自`来自@ StuffInc / contracts'。这就是我的意思(那是我应该做的正确的事情?所有NPM包都是这样的)

要做到这一点我收集我需要将所有内容放在一个{{1}}文件中。我是否仍然可以将我的代码编写在逻辑单独的文件中,但是它是否可以构建到一个定义中,以便其他开发人员可以减少猜测工作量?

1 个答案:

答案 0 :(得分:0)

你非常接近,只有你缺少的东西才能得到漂亮的名字是一个带有export * from '@StuffInc/contracts/Wizards'的index.ts

诀窍是你可以从不同的文件中多次导出。 像webpack这样的模块加载器会知道查找以项目命名的index.d.ts或.d.ts(时刻有片刻.ts。)。

现在js / ts中的模块有点复杂,但随着es6模块越来越正常,它越来越好。还有一些称为默认导出的东西,它们允许import package from 'package'语法。像Moment这样具有全局命名空间的工具应该使用它,它也允许命名导入。 import moment, { Duration } from 'moment'。尽管如此,没有多少模块使用默认值,因此您无法从那一行开始导入。你必须这样做import * as moment from 'moment'。如果它们具有声明的命名空间而不是显式的exports / default,您将看到这一点。我的观点是,如果可以的话,你想要远离*进口,你将不得不使用它们导入一个没有设置它们的节点模块,但是使用明确的导入模块捆绑包可以使用像树摇动和代码分裂。

我已经快速了解到目前为止我能够弄清楚的内容,但我会对模块进行更多的研究。