【问题标题】:Ambient declaration styles and modules环境声明样式和模块
【发布时间】:2012-11-08 21:12:14
【问题描述】:

有些人正在使用 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 {

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

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      module MyModule {
      }
      

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

      原来的讨论在这里,它已经被移到一个工作项中:

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

      【讨论】:

      • 其实这是很不一样的东西。您的请求是关于生成 JavaScript 的模块。这个问题是关于用于向编译器声明类型的“声明模块”。
      猜你喜欢
      • 2012-10-12
      • 2015-10-17
      • 2018-10-20
      • 2016-08-30
      • 2016-09-06
      • 2014-10-16
      • 2016-06-06
      • 1970-01-01
      • 2019-01-15
      相关资源
      最近更新 更多