环境声明样式和模块

rya*_*yan 5 javascript typescript

有人正在使用Backbone.d.ts编写Backbone应用程序.我想讨论两个用例.

  1. 使用AMD加载器创建骨干应用程序(或者我也考虑使用CommonJS)
  2. 使用普通JS创建骨干应用程序

对于阵营1中的人员,必须将骨干模块定义为外部模块,以便能够导入模块并将其包含在define()包装器中.

对于阵营2中的人,必须将骨干模块定义为内部模块,以便使用智能感知而不需要使用import语句/ define()包装器.

问题:是否有其他方法来定义模块,以便在两种情况下都可以使用它?


我真的不想创建一个叉子,这样你就可以拥有它

// required for those using import (1)
declare module "Backbone" { 
Run Code Online (Sandbox Code Playgroud)

要么

// required for those not using import (2) and backbone already exists in the global scope
declare module Backbone {
Run Code Online (Sandbox Code Playgroud)

并且仍然能够与您的代码/ intellisense相处.

Rya*_*ugh 2

仅使用一个文件无法完成这一.d.ts任务,因为编译器需要知道您使用哪种模块系统作为主干,以便知道要生成哪种代码。您可以在单个文件中混合和匹配内部和外部模块,并且无法正确猜测您具体使用哪个主干模块。

您也许可以使用interface声明来实现,这样您就可以在一个地方声明大部分内容,并拥有引用该公共的“backbone-internal.d.ts”和“backbone-external.d.ts”文件声明文件,但您能做到的程度将完全取决于 API 的表面区域。

TL;DR:阵营 1 和阵营 2 并不相互排斥,即使在同一文件中也是如此。