首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual对TypeScript文件的隐式引用应该如何工作?

Visual对TypeScript文件的隐式引用应该如何工作?
EN

Stack Overflow用户
提问于 2014-02-15 20:31:06
回答 2查看 3.7K关注 0票数 3

我想让TypeScript在0.9.5版上再试一次,因为我已经暂时不使用它了。

在我发现的新旧信息的混合体中,我有这样的想法:项目中的所有TypeScript文件都将“隐式地相互引用”。

我搞不懂这意味着什么。我的一种理论是,这意味着每个文件都可以看到从其他文件导出的所有函数、类等,都是在全局范围内。(如果这是真的,这听起来并不是个好主意。)

问题是,我不能确定任何解释是否正确,因为在与Visual的0.9.5集成中似乎存在bug,因此它没有达到(某些人)的预期。

我的测试是一个在Visual 2013中创建的‘’项目,其中安装了项目模板页面中的链接中的TypeScript插件。

我添加了第二个.ts文件,该文件导出一个名称愚蠢的类:

代码语言:javascript
复制
export class Hedgehog {
    spikes() {
        return 100;
    }
}

还添加了来自DefinitelyTypedDefinitelyTyped

在主app.ts文件中,当我尝试使用来自app.ts的类时,VS会给出智能感知错误。

代码语言:javascript
复制
var h = new Hedgehog(); // Could not find symbol Hedgehog

如果我尝试使用ko中的任何东西,它也会抱怨

代码语言:javascript
复制
var five = ko.observable(5); // Could not find symbol ko

这个问题抱怨隐含引用不起作用和有一个注释暗示解决方案,即手工编辑项目文件。然而,这个人改变了他们项目的这一行:

代码语言:javascript
复制
<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets"
        Condition="'$(Configuration)' == 'Debug'" />

对此:

代码语言:javascript
复制
<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets" 
        Condition="Exists('$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets')" />

然后他们显然很高兴(结果是什么?!)

但是我刚刚生成的项目看起来已经像第二个版本了。我试着完全消除这种情况:

代码语言:javascript
复制
<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets" />

然后我就有了一些进展。现在,我在两个.ts文件中都有了用于Knockout的intellisense,但是我仍然不能使用我的Hedgehog类。我需要补充的是:

代码语言:javascript
复制
import otherFile = require('otherFile');
var Hedgehog = otherFile.Hedgehog;

这实际上是很理想的。在我的主要JavaScript项目中,已经使用了带有本地链接器的commonjs模块(类似于褐化网络制作),所以我肯定不希望我的数千个出口产品被合并到一个巨大的全球范围(我真诚地希望这不是预期的行为)。但我也使用第三方库,如Knockout和jQuery,我只是将它们混入全局范围,以便所有模块都可以使用,就像DOM一样。因此,我希望.d.ts得到不同的对待,并将它们的声明自动添加到所有模块的全局范围中。

所以手黑客的最终结果就是我有了我想要的行为。但在TypeScript 1.0中,这种情况会继续下去吗?

我在布告栏上读到:

随着前面对Visual体验的改进,我们移到了隐式引用项目中包含的.ts文件的项目。这减少了必须显式引用项目中的文件,使体验更接近C#。不幸的是,当使用选项连接输出.js文件时,它也不能很好地工作。 我们正在继续改进这种体验。从0.9.5开始,您现在可以向项目中添加一个_references.ts文件。这个文件将是第一个传递给编译器的文件,它允许您更多地控制生成的.js文件的顺序,当使用组合JavaScript输出到文件选项时(相当于使用-out命令行选项)。

我不能凭直觉知道这一点!他们是说他们已经改变了行为,但只有在组合JS输出文件时才会这样做吗?或者他们在所有情况下都改变了它?如果有帮助,我还没有在我的测试项目中启用“将JavaScript输出合并到文件”选项。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-15 23:16:49

项目中的所有TypeScript文件都隐含地相互引用。这基本上就像说它们都一起传递给编译器一样,就好像您已经在命令行中指定了它们的所有名称一样。

但是,这只发生在具有Build Action (参见属性窗口)的文件中。由于蹩脚的技术原因,在向项目中添加.ts或.d.ts文件时,这不是默认情况,因此,如果希望将该文件包括在项目上下文中,则需要手动更改Build Action属性。这就是为什么您的文件不能隐式地看到ko

第二个问题是export的使用。有关完整的讨论,请参阅TypeScript中的模块,但简短的版本是,当您在顶层使用export时,包含的文件将变成一个外部模块(正如您发现的那样),因此如果不使用import (同样如您所发现的),其他文件将无法自动看到它的内容。这也是运行时行为。如果您希望对象进入全局范围,只需去掉export关键字--当您不使用外部模块时,在TypeScript中没有文件级可见性的概念。

最后,是的,您可以通过外部模块导入( JQuery )或全局范围($.whatever)混合和匹配第三方库(如import ko = require('ko')或Knockout ),只要它们的定义文件被编写以支持它,就像knockout.d.ts一样。

票数 8
EN

Stack Overflow用户

发布于 2014-02-16 21:06:08

我只想回应你的评论:

然后他们显然很高兴(结果是什么?!)

当我移到使用现有条件而不是调试条件时,我再次成为intellisense的感激接收者。实际上,当我这样做的时候,TypeScript语言服务又复活了。

至于它的价值,我现在很高兴在我的项目中使用Knockout (带有全局ko变量)。

_references.TS似乎不再是必要的,除非您需要影响可用函数的重载排序。(我不认为这对你来说是个问题。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21803257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档