【问题标题】:Do I have to reference TypeScript definition in every file?我是否必须在每个文件中引用 TypeScript 定义?
【发布时间】:2015-05-13 09:45:43
【问题描述】:

有没有办法告诉 TypeScript 使用某个文件(或一组文件)作为所有编译内容的定义?

我目前唯一的选择是在每个 TypeScript 文件中添加类似的内容(这看起来很笨重):

/// <reference path="DefinitelyTyped/requirejs/require.d.ts" />

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    一些 IDE 会自动检测项目中的所有文件 (Visual Studio)。

    对于其他所有内容,您可以创建一个_references.ts 文件并将所有参考 cmets 放入其中 - 然后您只需添加:

    /// <reference path="_references.ts" />
    

    ...到每个文件(而不是可能很多)。

    您的 IDE 也可能支持tsconfig files

    【讨论】:

      【解决方案2】:

      使用 TypeScript 的内部模块系统时,您可以完全避免在代码中包含任何 &lt;reference&gt; 标记。我个人这样做是因为我不想在代码中编码路径(真实的或绝对的),因为我不断地移动东西。

      一种方法是确保在编译期间将所有必需的声明文件和 TypeScript 源文件作为参数传递给编译器。

      gulpgulp-typescript 一起使用可以简化此任务。您可以将 gulp-typescript 中的 noExternalResolve 设置为 true,并创建 gulp 任务,将所有 .d.ts 文件连同源代码一起通过管道传递给编译器。当您将tsd 拉入您的堆栈时,您只需传递包含对通过tsd 安装的所有其他定义文件的引用的tsd.d.ts文件。

      TypeScript 更新>= v1.5:您可以使用tsconfig.json 文件,编译器将正确地获取类的顺序。这消除了一起使用gulp-typescript 的需要。您可以选择在 tsconfig.json 文件中明确列出所有文件,也可以完全省略 files 属性以将所有 *.ts/*.tsx 文件包含在 tsconfig.json 所在目录中(包括所有子文件夹)。

      tsconfig.json的示例可能如下所示:

      {
          "compilerOptions": {
              "target": "ES5",
              "module": "commonjs",
              "lib": [ "es5", "es2015.promise", "dom" ]
          },
          "include": [
              "src/**/*.ts"
          ]
      }
      

      【讨论】:

      • 如果:在同一个模块中,你在文件 A.ts 中有类 A,在文件 B.ts 中有类 B,并且 A 扩展 B,你仍然需要告诉 tsc B.ts 应该在 A.ts 之前被转译,对吧?
      • 没错,包含的顺序很重要。对于 typescript 的内部模块(现在称为 namespaces),这仍然是一件令人讨厌的事情
      • 不幸的是,在 Paolo 所描述的情况下,您仍然需要显式引用路径。
      • 即使使用纯视觉工作室,它也拒绝在连接的输出文件中正确排序文件。似乎@JohnWhite 仍然正确?
      • 我现在明白我误解了你的回答。我将其解释为编译器可以自行获得正确的顺序,而您的答案中隐含的是您必须对编译器的输入进行排序。
      【解决方案3】:

      这个问题与Reference typescript definitions in one file, instead of all JS files?重复

      答案是,现在,将您要引用的每个文件添加到 tsconfig.json 文件的“文件”部分。它仍然有很多行,但都在一个文件中。

      将来当Typescript 2 发布时,您可以使用“filesGlob”部分并分两行解决问题。

      【讨论】:

      • 更好的选择是根本不指定“文件”。 github.com/Microsoft/TypeScript/wiki/tsconfig.json#detailsIf no "files" property is present in a tsconfig.json, the compiler defaults to including all TypeScript (*.ts or *.tsx) files in the containing directory and subdirectories. When a "files" property is present, only the specified files are included.
      • 这不一定“更好”。在现实世界的项目中,您的排除列表会大大增加(即我经常不得不排除node_modulesdistbower_componentstypings 等)。我正在拼命等待filesGlob 登陆核心 TS。
      【解决方案4】:

      我最近开始使用 TypeScript,据我了解,内部模块的解决方案是,是的,您可以从 tsconfig.json 的目录及其所有子目录编译所有 .ts 文件,前提是您不这样做'没有在其中设置 .ts 文件,但没有 /// &lt;references path="" /&gt;

      但是.ts 文件被编译成.js 文件的顺序不是由文件(或它们包含的类)所具有的依赖关系决定的。因此可能会出现子类在父类之前编译的情况(子类继承自父关系)。然后代码不会运行,即使它编译成功。它会抱怨它无法理解子类中的父类。因此,您需要添加/// &lt;references path="" /&gt; 作为提示给编译器以解决.ts 文件之间的依赖关系。

      这是要 Typescript 文档说的:

      /// 指令是该组中最常见的。它用作文件之间依赖关系的声明。

      三斜杠引用指示编译器在编译过程中包含其他文件。

      当使用 --out 或 --outFile 时,它​​们还用作对输出进行排序的方法。预处理通过后,文件按照与输入相同的顺序发送到输出文件位置。

      【讨论】:

        【解决方案5】:

        到目前为止,我了解到的是 /// -ing a module 使用参考 cmets 并不是一个好方法。

        例如:如果您有一个文件 Foo 和一个文件 Bar。这两个文件都使用 jquery,但只有文件 Foo 有对 jquery 的引用注释。如果文件 Foo 因某种原因被删除,则您的文件 Bar 已损坏,因为缺少引用。

        如果您使用 TypeScript >= 2.0,最好在 "files" 部分下的 tsconfig.json 中定义 TypeScript 定义文件 (.d.ts)。

        这可能看起来像这样:

        {
          "compileOnSave": true,
          "compilerOptions": {
            "noImplicitAny": true,
            "noEmitOnError": true,
            "removeComments": false,
            "sourceMap": true,
            "target": "es5", 
            "outDir": "./Scripts/"
          },
          "files": [
            "./src/foo.ts",
            "./src/bar.ts",
            "./Scripts/typings/jquery/jquery.d.ts",
            "./Scripts/typings/jqueryui/jqueryui.d.ts",
            "./Scripts/MicrosoftMaps/Microsoft.Maps.d.ts"
          ]
        }
        

        在示例中经常使用 /// 指令(参考 cmets)来帮助您快速入门,但这不是最佳实践。 还有许多示例来自

        【讨论】:

          猜你喜欢
          • 2016-02-24
          • 2013-08-30
          • 1970-01-01
          • 2016-12-17
          • 2012-02-13
          • 2018-12-29
          • 1970-01-01
          • 2019-11-05
          • 1970-01-01
          相关资源
          最近更新 更多