Typescript module()和AMD使用会导致代码不可压缩

Typescript module()和AMD使用会导致代码不可压缩,typescript,Typescript,场景1: 我有一个项目,其中包含两个Typescript文件,如下所示: // file:/app/Dogs/Beagle.ts export module Dogs { export Class Beagle { public Bark() { document.write('Woof'); } } } // file:/app/DogPage.ts import m = module('./Dogs/Beagle'); var b = new m.Dog

场景1:

我有一个项目,其中包含两个Typescript文件,如下所示:

// file:/app/Dogs/Beagle.ts
export module Dogs {
  export Class Beagle {
    public Bark() {
      document.write('Woof');
    }
  }
}

// file:/app/DogPage.ts
import m = module('./Dogs/Beagle');
var b = new m.Dogs.Beagle();
b.Bark();

// file:/config.ts
var require: {baseUrl: '/app'};
/project1
  /Dogs.html
  /DogPage.ts
  /app
    /Beagle.ts
这些很好。我还使用RequireJS在我的
Dogs.html
网页上加载文件,使用以下html代码:

<script src="/app/config.js" type="text/javascript"></script>
<script data-main="DogPage" src="lib/require.js" type="text/javascript"></script>
我计划在部署时复制Project3的
app
文件夹,使结构如下所示:

// file:/app/Dogs/Beagle.ts
export module Dogs {
  export Class Beagle {
    public Bark() {
      document.write('Woof');
    }
  }
}

// file:/app/DogPage.ts
import m = module('./Dogs/Beagle');
var b = new m.Dogs.Beagle();
b.Bark();

// file:/config.ts
var require: {baseUrl: '/app'};
/project1
  /Dogs.html
  /DogPage.ts
  /app
    /Beagle.ts
我现在如何将Beagle.ts链接到我的2个应用程序,以便我可以在开发时编译它们,并且仍然按照所述在生产中使用路径?上面的路径可以在运行时运行,但我无法在开发时编译代码

如果我这样做:

import m = module('../../../Dogs/Beagle');
当然,在开发时,它在我的硬盘上处于相对位置,在生产中永远不会工作

似乎我被卡住了,必须在两个项目中维护代码的副本。对于这个精心设计的示例来说,这可能不是什么大不了的事情,但我真正的项目包含几十个可重用的类文件。如何组织这些乱七八糟的东西,并让它继续编译

更新: BASarat关于VS“链接文件”的建议导致:

/*
Compile Error. 
See error list for details
 C:\proj2\app\MoreDogs.ts(2,34) : Incorrect reference: imported file: "./Dogs/Beagle" cannot be resolved.
C:/proj2/app/MoreDogs.ts(2,18): The name ''./Dogs/Beagle'' does not exist in the current scope
C:/proj2/app/MoreDogs.ts(2,18): A module cannot be aliased to a non-module type
C:/proj2/app/MoreDogs.ts(5,12): Expected var, class, interface, or module
*/


如果开发人员使用Visual Studio(这是我不愿意做的假设),那么从解决方案资源管理器的角度来看,这会产生一种基于统一代码的错觉,但是TypeScript不会使用解决方案资源管理器对代码库的理解来编译,因此编译实际上失败了。我遗漏了什么吗?

在两个项目中都添加一个“指向外部文件的链接”


你应该重新考虑你的方法。你正在开发一个库,因此你应该这样对待它。我建议不要尝试引用共享资源的源代码。此外,您在尝试以这种方式解决问题时已经遇到了问题

因此,我的建议是将您的共享项目视为一个外部库,如jQuery。应该将共享项目的<强>输出< /强>作为其他项目的依赖项,而不是直接引用源。 那么,您如何做到这一点并继续使用TypeScript呢?您可以为共享库提供一个定义文件,其中包含使用它的项目的所有定义。然后要求在应用程序入口点的某个位置输出共享库,以确保这些模块可以被引用。最后,使用
require(“module\u name”)
语句将需要的模块包括在内


这个问题的答案和我上面描述的方法一样。但是,我没有将您的问题标记为完全相同的问题,但想法显然是相同的。

虽然问题有点不同,但您需要的答案可能是:-请记住,根据该示例,需要考虑部署。我检查了该答案,在我看来,它和巴萨拉特的答案有着同样的局限性。typescript编译器似乎无法使用它,尽管Solution Explorer对该文件进行了可视化显示。实际上,仔细查看我的设置,我发现是我使用的Web Essentials及其“保存时编译”功能导致了立即的失败。当最终的Typescript编译在构建时运行时,VisualStudio可能会复制该文件?但是语法错误也出现在VS编辑器中,并且没有intellisense,这让我想知道开发人员如何使用这种方法编写代码。我认为它不会起作用。当我在VisualStudio中测试它时,它起作用了。将我要引用的TypeScript文件从解决方案资源管理器拖到我正在处理的TypeScript文件上,会自动提供文件的相对路径(而不是手动写入
\\\n在VS中运行构建序列会导致与Web Ess在保存时编译相同的错误。如果开发人员使用Visual Studio(这是我不愿意做的假设)从解决方案资源管理器的角度来看,这产生了一种基于统一代码的错觉,但TypeScript并没有使用解决方案资源管理器对代码库的理解进行编译,因此编译实际上失败了。也许我遗漏了一些东西,但这一建议除了使解决方案资源管理器看起来更简单之外,似乎没有任何效果当文件不存在时,它就在那里。提供的链接会显示404,答案的文本似乎不能充分描述解决方案。我现在使用Visual Studio,我使用预构建目标在链接的TS文件中进行复制。虽然我可以通过从命令行运行
tsc
来编译,但Visual Studio继续显示生成错误当我
需要
链接的TS文件时。功能不匹配很烦人。