我是否必须在每个文件中引用typescript定义

时间:2015-03-11 14:32:40

标签: javascript typescript

有没有办法告诉打字稿使用某个文件(或文件集)作为编译的所有内容的定义?

我目前唯一的选择是在每个打字稿文件中添加这样的东西(看起来很笨重):

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

5 个答案:

答案 0 :(得分:34)

使用TypeScript的内部模块系统时,您可以避免代码中包含任何<reference>标记。我个人这样做是因为我不想在代码中对路径(实际或绝对)进行编码,因为我经常移动它们。

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

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

TypeScript的更新&gt; = 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"
    ]
}

答案 1 :(得分:10)

到目前为止我所学到的是 ///&lt;参考&gt; - 带参考评论的模块不是一个好方法。

例如:如果您有一个文件 Foo 和一个文件 Bar 。两个文件都使用jquery,但只有文件 Foo 对jquery有引用注释。如果由于某种原因删除了文件 Foo ,则文件 Bar 会被破坏,因为缺少参考。

如果您使用的是TypeScript&gt; = 2.0最好在&#34; files&#34; 部分的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"
  ]
}

在示例中经常使用///指令(引用注释)来快速入门,但这不是最佳实践。 许多例子来自版本&lt; TypeScript 2.0。

答案 2 :(得分:3)

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

对于其他所有内容,您可以创建一个_references.ts文件并将所有参考评论放在那里 - 然后您只需要添加:

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

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

您的IDE也可能支持tsconfig files

答案 3 :(得分:3)

此问题与Reference typescript definitions in one file, instead of all JS files?

重复

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

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

答案 4 :(得分:0)

我最近刚开始使用TypeScript,而且我已经了解内部模块解析是的,您可以编译来自.ts的所有tsconfig.json个文件目录及其所有子目录,前提是您没有.ts设置/// <references path="" />个文件。

.ts文件编译成结果.js文件的顺序不是由文件(或它们包含的类)所依赖的依赖项决定的。因此,可能存在子类在父类之前编译的情况(子类从父关系继承)。然后代码不会运行,即使它已成功编译。它会抱怨它无法理解子类中的父类。因此,您需要向编译器添加/// <references path="" />作为提示,以解决.ts文件之间的依赖关系。

这是希望Typescript文档说:

  

///指令是该组中最常见的。它充当文件之间的依赖声明。

     

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

     

它们还可以作为在使用--out或--outFile时对输出进行排序的方法。在预处理传递之后,文件以与输入相同的顺序发送到输出文件位置。