环境声明样式和模块

时间:2012-11-20 18:05:48

标签: javascript typescript

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

  1. 使用AMD加载程序创建骨干应用程序(或者我也考虑使用CommonJS)
  2. 使用普通JS创建骨干应用程序
  3. 对于阵营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 {
    

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

2 个答案:

答案 0 :(得分:2)

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

我提议如果你用...编写所有模块

module MyModule {
}

... wrapper,如果你将模块标志发送给编译器,它应该剥离模块声明,如果它与文件名匹配。这样你就可以编写一个模块,可以在没有修改的情况下编译为在web,CommonJS或AMD上工作。

原始讨论在这里,它已被移入工作项目:

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

答案 1 :(得分:2)

仅使用一个.d.ts文件无法完成此操作,因为编译器需要知道您用于主干的模块系统类型,以便了解要生成的代码类型。您可以在单个文件中混合和匹配内部和外部模块,并且无法正确猜出您用于骨干的特定内容。

您可以使用interface声明来制作它,以便您可以在一个地方声明大部分内容并拥有“backbone-internal.d.ts”和“backbone-external.d”。 .ts“引用该公共声明文件的文件,但您可以在多大程度上依赖于API的表面区域。

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