打字稿2.0。 "类型" tsconfig.json中的字段

时间:2016-10-03 07:55:15

标签: typescript typescript-typings typescript2.0

我不理解//The Application's onStart() method calls the local method displayNextImage() //images is some collection that implements getNext() and isEmpty() void displayNextImage() { timeline = new Timeline(); KeyValue transparent = new KeyValue(imageView.opacityProperty(), 0.0); KeyValue opaque = new KeyValue(imageView.opacityProperty(), 1.0); KeyFrame startFadeIn = new KeyFrame(Duration.ZERO, e -> {imageView.setImage(images.getNext());}, transparent); KeyFrame endFadeIn = new KeyFrame(Duration.millis(250), opaque); KeyFrame startFadeOut = new KeyFrame(Duration.millis(750), opaque); KeyFrame endFadeOut = new KeyFrame(Duration.millis(1000), e -> {imageView.setImage(null);}, transparent); timeline.getKeyFrames().addAll(startFadeIn, endFadeIn, startFadeOut, endFadeOut); timeline.setCycleCount(Animation.INDEFINITE); timeline.setOnFinished(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { if (!images.isEmpty()) { displayNextImage(); } } }); timeline.play(); } 'WHERE employees.department_id = departments.department_id'字段的含义。在文档中我读过这样的文字:

types

据我所知,如果我安装tsconfig.json,我应该在"types": { "description": "Type declaration files to be included in compilation. Requires TypeScript version 2.0 or later.", "type": "array", "items": { "type": "string" } }, 中添加此类字符串

@types/express

但没有它,一切正常。现在我不明白,为什么我需要tsconfig.json字段

3 个答案:

答案 0 :(得分:91)

从TypeScript 2开始。*&#39; tsconfig.json&#39;有以下两个属性:

{
    'typeRoots': [],
    'types': [] 
}

我按顺序详细说明。

  1. &#39; typeRoots&#39;指定转换器应在其中查找类型定义的根文件夹(例如:&#39; node_modules&#39;)。

    • 如果您一直在使用打字稿,您知道对于尚未使用打字稿编写的不同库,您需要定义,以便编译器识别全局变量并获得IntelliSense支持。

    • 此问题已由项目(回购)解决,例如&#39; DefinatelyTyped&#39;使用 tsd typings 模块等工具下载项目所需的类型,但它们也随附他们自己的&#39; json&#39;需要单独维护的文件。

    • 使用TS2。*,您现在可以使用&#39; npm&#39;来获取定义依赖关系。因此,您现在可以使用:而不是使用单独的cli库,例如 tsd typings npm i @types/{LIB} 这样,所有依赖项都使用 package.json 进行管理,您可以轻松地消除另一个“json”的必要性。要在项目中维护的文件。

    1. &#39;类型&#39;是typeRoot中的实际库名称。

      • 所以让我们说你有typeRoots的默认配置,它看起来像:

        "typeRoots": [
            "./node_modules/@types"
        ]
        
      • 让我们假设你现在想要使用jasmine作为项目的测试框架,所以你配置了 typeRoot 文件夹,你现在所做的就是执行: npm i @types/jasmine --save-dev

      • 安装定义包后,您只需配置“&#39;类型&#39;属于&#39; tsconfig.json&#39;如下:

        "types": [
             "core-js",
             "jasmine",
             "requirejs",
             "chance"
        ]
        
    2. 总而言之,基本上你告诉TS编译器:

      typeRoots :您需要在这些文件夹中查找输入内容。 types :在上面提供的其中一个文件夹中,您可以找到这些framworks(子文件夹)的定义。

      所以使用上面的场景,如果我们添加另一个根:

      "typeRoots": [
          "./node_modules/@types",
          "./custom_definitions"
      ],
      "types": [
          "jasmine",
      ]
      

      TS现在将在

      中查找定义文件

      ./node_modules/@types/jasmine

      ./custom_definitions/jasmine

      希望这有帮助!

答案 1 :(得分:17)

您不一定需要类型字段。以下是documentation中需要注意的重要部分:

  

默认情况下,所有可见的“@types”包都包含在您的   汇编。任何封闭文件夹的node_modules / @类型中的包   被认为是可见的

因此,如果您遵循惯例或使用工具集(如npm)下载@types包,则不需要配置 typeRoots 类型在您的配置中,因为它将使用默认文件夹结构开箱即用。

答案 2 :(得分:0)

除了其他答案外,还有些小的问题:tsconfig.json中的@types属性主要用于全局声明(无需import ing模块即可使用的逻辑)。因此,import不会限制您的类型。例如。您拥有以下软件包:node_modules/@types/foo。并且您的@types属性等于[bar]。如果foo是基于模块的逻辑,您会发现它仍然有效:

import {A, B, C} from 'foo'

请参阅TS文档:

  

请记住,仅当您使用带有全局声明的文件(而不是声明为模块的文件)时,自动包含才重要。例如,如果使用import“ foo”语句,TypeScript可能仍会遍历node_modules和node_modules / @ types文件夹来查找foo包。