我正在给TypeScript另一个尝试0.9.5版本,暂时离开它一段时间。
在我发现的新旧信息的混合中,我认为项目中的所有TypeScript文件都会“隐式引用”。
我无法理解这意味着什么。我的一个理论是,它意味着每个文件都能够查看从其他所有文件导出的所有函数,类等,所有这些都在全局范围内。 (如果这是真的,这听起来不是一个好主意。)
问题是,我无法确定是否有任何解释是正确的,因为0.9.5与Visual Studio的集成似乎存在错误,因此它没有做到(某些)人们期望的那样。
我的测试是在Visual Studio 2013中创建的'带有TypeScript的HTML应用程序'项目,并在项目模板页面的链接中安装了TypeScript插件。
我添加了第二个.ts
文件,该文件导出一个名称愚蠢的类:
export class Hedgehog {
spikes() {
return 100;
}
}
并从DefinitelyTyped添加了knockout.d.ts
。
在主app.ts
文件中,如果我尝试使用app.ts
中的类,则VS会给出智能感知错误:
var h = new Hedgehog(); // Could not find symbol Hedgehog
如果我尝试使用ko
:
var five = ko.observable(5); // Could not find symbol ko
This issue complains that implicit referencing doesn't work并且有一条暗示解决方案的评论,即手工编辑项目文件。但是,那个人改变了他们项目的这一行:
<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets"
Condition="'$(Configuration)' == 'Debug'" />
对此:
<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets"
Condition="Exists('$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets')" />
然后他们显然很开心(尽管结果如何?!)
但我刚刚生成的项目已经看起来像第二个版本。我试图完全删除这个条件:
<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets" />
然后我取得了一些进展。我现在在两个.ts文件中对Knockout进行智能感知,但我仍然无法使用我的Hedgehog
类。我需要补充一下:
import otherFile = require('otherFile');
var Hedgehog = otherFile.Hedgehog;
这实际上是理想的。在我的主要JavaScript项目中,已经使用了带有本地链接器的commonjs模块(类似于browserify或webmake),因此我绝对不希望将所有数千个导出合并为巨型全球范围(我真诚地希望这不是预期的行为)。但我也使用像Knockout和jQuery这样的第三方库,我只是将它们混合到全局范围中,因此它们可以像DOM那样用于所有模块。所以我希望.d.ts
被区别对待,并自动将它们的声明添加到所有模块的全局范围。
因此,手工黑客的最终结果是我确实有我想要的行为。但是它会继续像TypeScript 1.0那样继续吗?
通过以前对Visual Studio体验的改进,我们已经做到了 移动到项目隐式引用包含在.ts文件中的.ts文件 该项目。这减少了必须明确引用你的 项目中的文件,使体验更接近C#。 不幸的是,使用该选项时它也无法正常工作 连接你的输出.js文件。
我们正在继续改善这种体验。从0.9.5开始,你 现在可以将_references.ts文件添加到您的项目中。这个文件将是 第一个传递给编译器,让你更多地控制 在与Combine结合使用时,生成.js文件的顺序 JavaScript输出到文件选项(相当于使用--out 命令行选项)。
我不能直截了当地说出来!他们是说他们在组合JS输出文件时改变了行为但仅?或者他们在所有情况下都改变了吗?如果它有帮助,我没有在我的测试项目中启用“将JavaScript输出合并到文件中”选项。
答案 0 :(得分:8)
项目中的所有TypeScript文件都隐式相互引用。这基本上就像是说它们都被一起传递给编译器,就像你在命令行中指定了它们的所有名称一样。
但是,这仅适用于Build Action
TypeScriptCompile
(参见属性窗口)的文件。出于技术原因,在将.ts或.d.ts文件添加到项目时,这不是默认设置,因此如果您希望将文件包含在项目中,则需要手动更改Build Action
属性。项目背景。这就是您的文件无法隐式看到ko
的原因。
第二个问题是使用export
。有关完整讨论,请参阅Modules in TypeScript,但简短版本是当您在顶级使用export
时,包含的文件将成为外部模块(如您所发现的),因此其内容不会自动显示不使用import
的其他文件(再次发现)。这也是运行时行为。如果您希望对象进入全局范围,只需不要使用export
关键字 - 当您不使用外部时,TypeScript中没有文件级可见性的概念本身模块。
最后,是的,你可以通过外部模块导入(import ko = require('ko')
)或通过全局范围($.whatever
)混合和匹配是否获得第三方库,如JQuery或Knockout,只要他们的定义文件是为了支持它而创作的,因为knockout.d.ts
是。
答案 1 :(得分:1)
只是回应你的评论:
然后他们显然很开心(尽管结果如何?!)
当我开始使用Exists条件而不是Debug一个条件时,我又一次感激了intellisense的感恩节。基本上,当我这样做时,TypeScript语言服务恢复了生机。
为了它的价值,我现在很乐意在我的项目中使用Knockout(使用全局ko变量)。
_references.TS似乎不再需要,除非您需要影响可用功能的过载顺序。 (我不认为这对你说的话来说是一个问题。)