gpt4 book ai didi

visual-studio - Visual Studio 对 TypeScript 文件的隐式引用应该如何工作?

转载 作者:搜寻专家 更新时间:2023-10-30 21:02:57 25 4
gpt4 key购买 nike

我在 0.9.5 版中再次尝试使用 TypeScript,暂时搁置了它。

在我发现的新旧信息的混合体中,我想到一个项目中的所有 TypeScript 文件都将“隐式引用”彼此。

我不明白这是什么意思。我的一个理论是,这意味着每个文件都能够看到所有其他文件导出的所有函数、类等,所有这些都在全局范围内。 (如果这是真的,这听起来不像是个好主意。)

问题是,我不确定任何解释是否正确,因为 0.9.5 与 Visual Studio 的集成中似乎存在错误,因此它没有按照(某些)人们的预期进行。

我的测试是在 Visual Studio 2013 中创建的“带有 TypeScript 的 HTML 应用程序”项目,并通过项目模板页面中的链接安装了 TypeScript 插件。

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

export class Hedgehog {
spikes() {
return 100;
}
}

并且还添加了来自 DefinitelyTypedknockout.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 模块(类似于 browserifywebmake )所以我绝对不希望我所有的数千个导出被合并到一个巨大的全局范围(我我真诚地希望这不是预期的行为)。但我也使用第三方库,如 Knockout 和 jQuery,我只是将它们混合到全局范围中,以便它们像 DOM 一样可用于所有模块。所以我希望 .d.ts 被区别对待,并自动将它们的声明添加到所有模块的全局范围。

所以手工破解的最终结果是我得到了我想要的行为。但它会像 TypeScript 1.0 中那样继续吗?

我在 announcement post 上阅读:

With the previous improvements to the Visual Studio experience, we've moved to projects implicitly referencing the .ts files contained in the project. This cut down on having to explicitly reference your files in the project, bringing the experience much closer to C#. Unfortunately, it also did not work well when using the option to concatenate your output .js file.

We're continuing to improve this experience. Starting with 0.9.5, you can now add an _references.ts file to your project. This file will be the first passed to the compiler, allowing you more control over the order the generated .js file when used in combination with the Combine JavaScript output into file option (the equivalent of using the --out commandline option).

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

最佳答案

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

但是,这仅发生在具有 TypeScriptCompileBuild Action(请参阅属性窗口)的文件中。由于技术原因,这不是将 .ts 或 .d.ts 文件添加到项目时的默认设置,因此如果您希望文件被包含在项目上下文中。这就是为什么您的文件无法隐式看到 ko 的原因。

第二个问题是export的使用。有关完整讨论,请参阅 Modules in TypeScript ,但简短的版本是,当您在顶层使用 export 时,包含的文件成为外部模块(正如您发现的那样),因此如果不使用 import(同样如您所见)。这也是运行时行为。如果您希望对象进入全局范围,只需离开 export 关键字 - 当您不使用外部模块。

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

关于visual-studio - Visual Studio 对 TypeScript 文件的隐式引用应该如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21803257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com