我很抱歉,因为我是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
tsc
,Wizards.d.ts
之后我得到Wizards.js
和npm publish
。当我import {GetWizardsResponse} from '@StuffInc/contracts/Wizards'
时,我必须通过这样的方式来消费它:
import * as Express from 'express'
但是当我环顾四周时,更常见的是看到这样的导入:
import { Response, NextFunction } from 'express'
或
import { GetWizardsResponse } from '@StuffInc/contracts
所以我使用我的包看起来应该是这样的:
/wizards
这样我可以拥有/goblins
,/elves
,index.d.ts
,但导入始终来自`来自@ StuffInc / contracts'。这就是我的意思(那是我应该做的正确的事情?所有NPM包都是这样的)
要做到这一点我收集我需要将所有内容放在一个{{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,您将看到这一点。我的观点是,如果可以的话,你想要远离*进口,你将不得不使用它们导入一个没有设置它们的节点模块,但是使用明确的导入模块捆绑包可以使用像树摇动和代码分裂。
我已经快速了解到目前为止我能够弄清楚的内容,但我会对模块进行更多的研究。