Visual Studio对TypeScript文件的隐式引用如何工作?

Dan*_*ker 3 visual-studio typescript

我正在给TypeScript另一个尝试版本0.9.5,让它独自留了一段时间.

在我发现的新旧信息的混合中,我认为项目中的所有TypeScript文件都会"隐式地引用"彼此.

我无法弄清楚这意味着什么.我的一个理论是,它意味着每个文件都能够查看从其他所有文件导出的所有函数,类等,所有这些都在全局范围内.(如果这是真的,这听起来不是一个好主意.)

问题是,我无法确定是否有任何解释是正确的,因为0.9.5与Visual Studio的集成似乎存在错误,因此它没有做到(人们)所期望的.

我的测试是在Visual Studio 2013中创建的"带有TypeScript的HTML应用程序"项目,其中从项目模板页面的链接安装了TypeScript插件.

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

export class Hedgehog {
    spikes() {
        return 100;
    }
}
Run Code Online (Sandbox Code Playgroud)

并且还knockout.d.tsDefinitelyTyped添加.

在主app.ts文件中,如果我尝试使用我的类,VS会给出智能感知错误app.ts:

var h = new Hedgehog(); // Could not find symbol Hedgehog
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用以下任何内容,它也会抱怨ko:

var five = ko.observable(5); // Could not find symbol ko
Run Code Online (Sandbox Code Playgroud)

这个问题抱怨隐式引用不起作用,并且有一个暗示解决方案的注释,即手工编辑项目文件.但是,那个人改变了他们项目的这一行:

<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets"
        Condition="'$(Configuration)' == 'Debug'" />
Run Code Online (Sandbox Code Playgroud)

对此:

<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets" 
        Condition="Exists('$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets')" />
Run Code Online (Sandbox Code Playgroud)

然后他们显然很高兴(虽然结果如何?!)

但是我刚刚产生的项目已经看起来像第二个版本.我试图完全删除这个条件:

<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets" />
Run Code Online (Sandbox Code Playgroud)

然后我取得了一些进展.我现在在两个.ts文件中对Knockout进行智能感知,但我仍然无法使用我的Hedgehog课程.我需要添加:

import otherFile = require('otherFile');
var Hedgehog = otherFile.Hedgehog;
Run Code Online (Sandbox Code Playgroud)

这实际上是理想的.在我的主要的JavaScript项目中,已经使用了本土连接器(类似CommonJS的模块browserifywebmake),所以我绝对不希望我所有的数千出口合并成一个巨大的全球范围内的(我真诚地希望这不是预期的行为).但我也使用像Knockout和jQuery这样的第三方库,我只是将它们混合到全局范围中,因此它们可以像DOM那样用于所有模块.所以我想要.d.ts区别对待并自动将其声明添加到所有模块的全局范围.

因此,手工黑客的最终结果是我完全有我想要的行为.但它会继续像TypeScript 1.0那样继续吗?

我在宣布帖子上看到:

通过以前对Visual Studio体验的改进,我们已经转移到隐式引用项目中包含的.ts文件的项目.这减少了必须明确引用项目中的文件,使体验更接近C#.不幸的是,当使用选项连接输出.js文件时,它也无法正常工作.

我们将继续改善这种体验.从0.9.5开始,您现在可以将_references.ts文件添加到项目中.此文件将首先传递给编译器,允许您在与Combine JavaScript输出到文件选项(相当于使用--out命令行选项)的组合中使用时,更好地控制生成的.js文件的顺序.

我无法从中得到任何东西!他们是说他们改变了行为但只是在组合JS输出文件时?或者他们在所有情况下都改变了吗?如果有帮助,我没有在我的测试项目中启用"将JavaScript输出合并到文件中"选项.

Rya*_*ugh 8

项目中的所有TypeScript文件都隐式相互引用.这基本上就像说它们都被一起传递给编译器,就像你在命令行中指定了它们的所有名字一样.

但是,这仅适用于具有Build Action(参见属性窗口)的文件TypeScriptCompile.出于技术原因,在将.ts或.d.ts文件添加到项目时,这不是默认设置,因此Build Action如果希望将文件包含在项目上下文中,则需要手动更改属性.这就是为什么你的文件无法ko隐式看到的原因.

第二个问题是使用export.有关完整讨论,请参阅TypeScript中的模块,但简短版本是当您export在顶级使用时,包含的文件将成为外部模块(如您所发现的),因此其内容不会在不使用其他文件的情况下自动显示import(再次,你发现).这也是运行时行为.如果你希望对象进入全球范围内,只留下关export关键字-没有概念本身在打字稿文件级可视性,当你不使用外部模块.

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