Javascript 如何设计用于导出的typescript项目

Javascript 如何设计用于导出的typescript项目,javascript,node.js,typescript,npm,Javascript,Node.js,Typescript,Npm,我很抱歉,因为我是js生态系统的新手。我在一个使用typescript的地方工作,这很好,因为它帮助我摆脱了静态语言的背景。但是,我仍然不了解打包/模块系统,尤其是与typescript定义相关的打包/模块系统 我正在编写一个模块,其中包含一组描述web服务API契约的接口,供客户端库和API服务本身使用。如果这是C#/Java或其他东西,我会编写我的接口文件,打包,发布,然后说 从StuffInc.Contract.Wizards导入GetWizards响应 我就是这样接近我的打字脚本库的,所

我很抱歉,因为我是js生态系统的新手。我在一个使用typescript的地方工作,这很好,因为它帮助我摆脱了静态语言的背景。但是,我仍然不了解打包/模块系统,尤其是与typescript定义相关的打包/模块系统

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

从StuffInc.Contract.Wizards导入GetWizards响应

我就是这样接近我的打字脚本库的,所以我写了

export interface GetWizardsResponse {
    wizards: Wizard
    currentPage: number
    count: number
}
然后在我的
ts.config
中,我有
声明:true
,所以在
tsc
之后,我得到一个
Wizards.d.ts
Wizards.js
。当我
npm发布时

从'@StuffInc/contracts/Wizards'导入{GetWizardsResponse}

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

从“Express”导入*为Express

从“express”导入{Response,NextFunction}

因此,我使用我的软件包将其视为:

import{GetWizardsResponse}来自'@StuffInc/contracts

这样我就可以拥有
/wizards
/goblins
/elves
,但导入总是来自'from@StuffInc/contracts'。这就是我所做的(这就是我应该做的,对吗?所有的NPM包都是这样的)


要做到这一点,我需要将所有内容放在一个
index.d.ts
文件中。我仍然可以在逻辑上独立的文件中编写代码,但将其构建到一个定义中,这样其他开发人员的猜测工作就更少了吗

你很接近了,你唯一缺少的就是从“@StuffInc/contracts/Wizards”中导出的带有
export*的index.ts

诀窍在于,您可以从不同的文件多次导出某些内容。 像webpack这样的模块加载器将知道如何查找以您的项目命名的index.d.ts或a.d.ts(矩有矩.d.ts)

现在js/ts中的模块有点复杂,但是随着es6模块变得越来越正常,它会变得更好。还有一些东西叫做默认导出,它们允许从“package”导入包。像矩这样具有全局名称空间的工具应该使用它,它也允许命名导入<代码>从“时刻”导入时刻,{Duration}
。不过,使用默认值的模块还不多,所以不能像这一行那样从一开始就导入。您必须从“时刻”开始以时刻的形式执行此操作
import*
。如果它们有一个声明的名称空间,而不是显式的exports/default,您将看到这一点。我的观点是,如果可以的话,您希望远离*导入,您必须使用它们导入一个没有设置它们的节点模块,但是使用显式导入模块绑定器可以使用树抖动和代码拆分等技术使包变小


这是我到目前为止能够理解的一个快速复习,但我会对模块做更多的研究。

当我使用
export default xxx
时,我没有得到任何提示,但是
export xxx
工作正常。我不知道为什么,我想这是一个bug,只是无论如何不要在TS中使用
导出默认值
,我不太确定您遇到了什么问题,但我忍不住注意到您没有使用任何
在您的
.ts
示例中的任何位置,我确信这些示例会导致大量错误。例如,接口应类似于导出接口GetWizardsResponse{wizards:Wizard,currentPage:number,count:number},在每个接口之间使用逗号。然后是从“@StuffInc/contracts/Wizards”导入的
import{GetWizardsResponse}使用
在末尾。如果您能更具体地说明您正在做什么,并显示
向导的代码,我可能会提供帮助。@optq对不起,是的,您是正确的。我只是免费把密码交上去了。我真正的代码比较枯燥,所以我特意用了一些奇特的例子来确保问题的焦点。虽然out项目不使用
并且如果您使用它们,门楣会抱怨。显然它们是可选的。这是我对这种语言感到困惑的众多原因之一,有多种方法来做事情是如此有趣感谢详细的概述。所以我的目标应该是将{Wizard}从'myModule'导入到模块客户端可以更高效吗?有道理。要做到这一点,我需要在模块的根目录中有一个
index.d.ts`,它以某种方式指向
\wizards
或任何其他文件?是的。有一些工具可以生成定义文件,因此,如果您使用Web包,大多数ts加载程序都可以选择输出定义文件。tsc还有一个将生成.d.ts文件的
--declaration
标志。