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

Posted

技术标签:

【中文标题】打字稿 2.0。 tsconfig.json 中的“类型”字段【英文标题】:Typescript 2.0. "types" field in tsconfig.json 【发布时间】:2017-02-11 02:48:53 【问题描述】:

我不明白tsconfig.jsontypes 字段的含义。在文档中我读过这样的文字:

"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 中添加这样的字符串


  "compilerOptions": 
     ...
     "types": ["lodash"]
   
 

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

【问题讨论】:

【参考方案1】:

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

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

因此,如果您遵循约定或使用诸如 npm 之类的工具集来下载 @types 包,则无需在您的配置,因为它将使用默认文件夹结构开箱即用。

【讨论】:

谢谢!您对文档的引用是我解决 Angular 项目问题的关键。 Angular 在 tsconfig.app.json 中指定了一个空的“类型”,忽略了我所有的 \@types。删除修复了我的构建。【参考方案2】:

对其他答案的小补充:tsconfig.json 中的 @types 属性主要用于全局声明(您可以在没有 importing 模块的情况下使用的逻辑)。因此,如果您import,它不会限制您的类型。例如。你有这个包:node_modules/@types/foo。你的@types 属性等于[bar]。如果foo 是基于模块的逻辑,您会发现这仍然有效:

import A, B, C from 'foo'

参见 TS 文档:

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

【讨论】:

【参考方案3】:

从 TypeScript 2.* 开始,“tsconfig.json”具有以下两个可用属性:


    'typeRoots': [],
    'types': [] 

我会按顺序详细说明。


    'typeRoots' 指定转译器应在其中查找类型定义的根文件夹(例如:'node_modules')。

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

    此问题已通过使用 tsdtypings 模块来下载项目所需的类型,但它们也带有自己的“json”文件,需要单独维护。

    借助 TS2.*,您现在可以使用“npm”获取定义依赖项。因此,您现在可以使用 tsdtypings 等单独的 cli 库,而不是使用: npm i @types/LIB 这样,所有依赖项都使用 package.json 进行管理,您可以轻松地消除在项目中维护另一个“json”文件的必要性。

    李>

    'types' 是在 typeRoot 中找到的实际库名称。

    假设你有 typeRoots 的默认配置,看起来像这样:

    "typeRoots": [
        "./node_modules/@types"
    ]
    

    假设你现在想使用 jasmine 作为项目的测试框架,所以你已经配置了 typeRoot 文件夹,你现在要做的就是执行:npm i @types/jasmine --save-dev

    定义包安装后,你只需要在'tsconfig.json'中配置你的'types'属性如下:

    "types": [
         "core-js",
         "jasmine",
         "requirejs",
         "chance"
    ]
    

总结一下,基本上你告诉 TS 编译器如下:

typeRoots:您需要在这些文件夹中查找类型。 types:在上面提供的文件夹之一中,您可以找到这些框架(子文件夹)的定义。

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

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

TS 现在将在

中查找定义文件

./node_modules/@types/jasmine

./custom_definitions/jasmine

希望这会有所帮助!

【讨论】:

非常有用,谢谢!我们还需要在 ts 文件的顶部使用它吗? /// 你知道为什么这对某些类型(例如 moment 或 sinon)不起作用,而对其他类型起作用吗? @Michael 我刚才尝试安装类型(npm i @types/moment)以找出您的问题。如果您仔细查看,安装会以错误 `-- UNMET PEER DEPENDENCY watchify@>=3 结束,因此由于此错误,不会下载类型。并不是它不起作用,只是那些包具有未满足的对等依赖关系,因此无法下载。 这个解释对我来说似乎不正确。查看文档时指出“如果指定了类型,则仅包含列出的包”。所以通常情况下,你不应该指定类型,否则会限制可以使用的类型定义。 据我所知,如果你不指定“types”属性,它会默认包含它找到的所有内容。

以上是关于打字稿 2.0。 tsconfig.json 中的“类型”字段的主要内容,如果未能解决你的问题,请参考以下文章

找不到名称“JSON”打字稿文件

打字稿无法解析导入中的非相对路径

打字稿构建从 node_modules 文件夹中获取错误

使用打字稿路径映射时反应本机加载模块错误

无法从打字稿项目中的子目录加载 React 组件

打字稿编译不输出到 outDir 选项