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

Do I have to reference TypeScript definition in every file?

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

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

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

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

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

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

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

您的IDE可能还支持tsconfig files

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

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

使用 gulp together with gulp-typescript simplifies this task. You can set noExternalResolve in gulp-typescript to true, and create gulp tasks that take all your .d.ts files along with your sources and pipe it down to the compiler. When you pull in tsd 到您的堆栈中,您只需传递包含对通过 tsd.

安装的所有其他定义文件的引用的 tsd.d.ts 文件

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

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

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

此问题与

重复

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

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

我最近开始使用 TypeScript,据我所知,内部模块解决方案是,您可以编译 tsconfig.json 目录及其所有子目录中的所有 .ts 文件,前提是你没有在其中设置 .ts 个文件而没有 /// <references path="" />.

但是 .ts 文件编译成结果 .js 文件的顺序不是由文件(或它们包含的 classes)的依赖关系决定的。所以可能会出现子 class 在父 class 之前编译的情况(子从父关系继承)。那么代码就不会运行了,虽然编译成功了。它会抱怨它无法理解子 class 中的父 class。因此,您需要添加一个 /// <references path="" /> 作为编译器的提示,以解决 .ts 个文件之间的依赖关系。

这就是 Typescript 文档所说的:

The /// directive is the most common of this group. It serves as a declaration of dependency between files.

Triple-slash references instruct the compiler to include additional files in the compilation process.

They also serve as a method to order the output when using --out or --outFile. Files are emitted to the output file location in the same order as the input after preprocessing pass.

到目前为止,我了解到 /// -ing 带有参考注释的模块 并不是一个好方法。

例如:假设您有一个文件 Foo 和一个文件 Bar。两个文件都使用 jquery,但只有文件 Foo 有对 jquery 的引用注释。如果文件 Foo 由于某种原因被删除,您的文件 Bar 会损坏,因为引用丢失。

如果您使用的是 TypeScript >= 2.0 最好在 "files"tsconfig.json 下定义 TypeScript 定义文件 (.d.ts) =29=]节。

这可能是这样的:

{
  "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"
  ]
}

使用/// 指令(参考注释)经常用于示例中以帮助您快速入门,但这不是最佳实践。 还有很多示例来自 < TypeScript 2.0 版本。