打字稿 2.0。 tsconfig.json 中的“类型”字段
Posted
技术标签:
【中文标题】打字稿 2.0。 tsconfig.json 中的“类型”字段【英文标题】:Typescript 2.0. "types" field in tsconfig.json 【发布时间】:2017-02-11 02:48:53 【问题描述】:我不明白tsconfig.json
中types
字段的含义。在文档中我读过这样的文字:
"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 属性主要用于全局声明(您可以在没有 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 包。
【讨论】:
【参考方案3】:从 TypeScript 2.* 开始,“tsconfig.json”具有以下两个可用属性:
'typeRoots': [],
'types': []
我会按顺序详细说明。
'typeRoots' 指定转译器应在其中查找类型定义的根文件夹(例如:'node_modules')。
如果您一直在使用 typescript,您就会知道对于尚未使用 typescript 编写的不同库,您需要定义以便编译器能够识别全局变量并获得 IntelliSense 支持。
此问题已通过使用 tsd 或 typings 模块来下载项目所需的类型,但它们也带有自己的“json”文件,需要单独维护。
借助 TS2.*,您现在可以使用“npm”获取定义依赖项。因此,您现在可以使用 tsd 或 typings 等单独的 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 中的“类型”字段的主要内容,如果未能解决你的问题,请参考以下文章