5

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

  1. 使用 AMD 加载器(或者我想也是 CommonJS)创建带有模块的主干应用程序
  2. 使用纯 JS 创建主干应用程序

对于营地 1 中的那些,有必要将主干模块定义为外部模块,以便能够导入模块并将其包含在define()包装器中。

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

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


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

// required for those using import (1)
declare module "Backbone" { 

或者

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

并且仍然能够与您的代码/智能感知相处。

4

2 回答 2

2

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

您也许可以使用interface声明来实现,这样您就可以在一个地方声明大部分内容,并拥有一个引用该常见内容的“backbone-internal.d.ts”和“backbone-external.d.ts”文件声明文件,但您可以做到的程度将取决于 API 的表面积究竟是什么样的。

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

于 2012-11-29T01:36:21.700 回答
2

我已经向 TypeScript 团队提出了这个问题,他们已经打开了一个工作项。

我建议如果您使用...编写所有模块

module MyModule {
}

...包装器,如果您将模块标志发送给编译器,如果它与文件名匹配,它应该剥离模块声明。这样你就可以编写一个模块,无需修改就可以编译为在 web、CommonJS 或 AMD 上工作。

最初的讨论在这里,它已被移到一个工作项中:

http://typescript.codeplex.com/discussions/401397

于 2012-11-20T19:39:29.967 回答