编译 TypeScript
TypeScript 是 JavaScript 的类型化超集,可转译为纯 JavaScript。它提供类、模块和接口,以帮助您构建强大的组件。
安装 TypeScript 编译器
Visual Studio Code 包括 TypeScript 语言支持,但不包括 TypeScript 编译器 tsc
。您需要全局或在工作区中安装 TypeScript 编译器,才能将 TypeScript 源代码转译为 JavaScript (tsc HelloWorld.ts
)。
安装 TypeScript 最简单的方法是通过 npm,即 Node.js 包管理器。如果您安装了 npm,则可以通过以下方式在计算机上全局 (-g
) 安装 TypeScript
npm install -g typescript
您可以通过检查版本或帮助来测试您的安装。
tsc --version
tsc --help
另一种选择是在您的项目中本地安装 TypeScript 编译器 (npm install --save-dev typescript
),这样做的好处是可以避免与您可能拥有的其他 TypeScript 项目发生交互。
编译器与语言服务
重要的是要记住,VS Code 的 TypeScript 语言服务与您安装的 TypeScript 编译器是分开的。当您打开 TypeScript 文件时,您可以在语言状态栏项中看到 VS Code 的 TypeScript 版本。
您可以使用固定图标将 TypeScript 版本固定到状态栏。
在本文的后面,我们将讨论如何更改 VS Code 使用的 TypeScript 语言服务的版本。
tsconfig.json
通常,任何新的 TypeScript 项目的第一步是添加一个 tsconfig.json
文件。tsconfig.json
文件定义 TypeScript 项目设置,例如编译器选项和应包含的文件。为此,请打开您要存储源代码的文件夹,并添加一个名为 tsconfig.json
的新文件。在此文件中,IntelliSense(⌃Space (Windows, Linux Ctrl+Space)) 将在整个过程中为您提供帮助。
一个简单的 tsconfig.json
如下所示,用于 ES5、CommonJS 模块和源代码地图
{
"compilerOptions": {
"target": "ES5",
"module": "CommonJS",
"sourceMap": true
}
}
现在,当您创建作为项目一部分的 .ts
文件时,我们将提供丰富的编辑体验和语法验证。
将 TypeScript 转译为 JavaScript
VS Code 通过我们集成的任务运行器与 tsc
集成。我们可以使用它将 .ts
文件转译为 .js
文件。使用 VS Code 任务的另一个好处是,您可以在问题面板中获得集成的错误和警告检测。让我们逐步完成转译一个简单的 TypeScript Hello World 程序。
步骤 1:创建一个简单的 TS 文件
在空文件夹中打开 VS Code 并创建一个 helloworld.ts
文件,将以下代码放入该文件中...
let message: string = 'Hello World';
console.log(message);
为了测试您是否正确安装了 TypeScript 编译器 tsc
以及一个可用的 Hello World 程序,请打开终端并键入 tsc helloworld.ts
。您可以直接在 VS Code 中使用集成终端 (⌃` (Windows, Linux Ctrl+`))。
您现在应该看到转译后的 helloworld.js
JavaScript 文件,如果您安装了 Node.js,则可以通过键入 node helloworld.js
来运行它。
步骤 2:运行 TypeScript 构建
从全局终端菜单执行运行生成任务 (⇧⌘B (Windows, Linux Ctrl+Shift+B))。如果您在前面的部分中创建了 tsconfig.json
文件,则应显示以下选择器
选择 tsc: build 条目。这将在工作区中生成 HelloWorld.js
和 HelloWorld.js.map
文件。
如果您选择 tsc: watch,TypeScript 编译器将监视对 TypeScript 文件的更改,并在每次更改时运行转译器。
在底层,我们将 TypeScript 编译器作为任务运行。我们使用的命令是:tsc -p .
步骤 3:将 TypeScript 构建设置为默认值
您还可以将 TypeScript 构建任务定义为默认构建任务,以便在触发运行生成任务 (⇧⌘B (Windows, Linux Ctrl+Shift+B)) 时直接执行。为此,请从全局终端菜单中选择配置默认生成任务。这将显示一个选择器,其中包含可用的生成任务。选择 TypeScript tsc: build,这将生成以下 tasks.json
文件,位于 .vscode
文件夹中
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"type": "typescript",
"tsconfig": "tsconfig.json",
"problemMatcher": [
"$tsc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
请注意,该任务具有一个 group
JSON 对象,该对象将任务 kind
设置为 build
并使其成为默认值。现在,当您选择运行生成任务命令或按 (⇧⌘B (Windows, Linux Ctrl+Shift+B)) 时,系统不会提示您选择任务,并且您的编译会开始。
提示:您还可以使用 VS Code 的运行/调试功能来运行程序。有关在 VS Code 中运行和调试 Node.js 应用程序的详细信息,请参阅Node.js 教程
步骤 4:查看生成问题
VS Code 任务系统还可以通过问题匹配器检测生成问题。问题匹配器根据特定的生成工具解析生成输出,并提供集成的错误显示和导航。VS Code 附带了许多问题匹配器,上面在 tasks.json
中看到的 $tsc
是 TypeScript 编译器输出的问题匹配器。
例如,如果在我们的 TypeScript 文件中存在一个简单的错误(console.log
中多了一个 'g'),我们可能会从 tsc
获得以下输出
HelloWorld.ts(3,17): error TS2339: Property 'logg' does not exist on type 'Console'.
这将显示在终端面板 (⌃` (Windows, Linux Ctrl+`)) 中,并选择终端视图下拉列表中的 Tasks - build tsconfig.json。
您可以在状态栏中看到错误和警告计数。单击错误和警告图标以获取问题列表并导航到它们。
您还可以使用键盘打开列表 ⇧⌘M (Windows, Linux Ctrl+Shift+M)。
提示:任务为许多操作提供丰富的支持。有关如何配置任务的更多信息,请查看任务主题。
JavaScript 源代码地图支持
TypeScript 调试支持 JavaScript 源代码地图。要为您的 TypeScript 文件生成源代码地图,请使用 --sourcemap
选项进行编译,或将 tsconfig.json
文件中的 sourceMap
属性设置为 true
。
也支持内联源代码地图(源代码地图,其中内容存储为数据 URL 而不是单独的文件),尽管尚不支持内联源代码。
生成文件的输出位置
将生成的 JavaScript 文件与 TypeScript 源代码放在同一文件夹中,会在较大的项目中很快变得混乱。您可以使用 outDir
属性指定编译器的输出目录。
{
"compilerOptions": {
"target": "ES5",
"module": "CommonJS",
"outDir": "out"
}
}
隐藏派生的 JavaScript 文件
当您使用 TypeScript 时,您通常不希望在文件资源管理器或搜索结果中看到生成的 JavaScript 文件。VS Code 通过 files.exclude
工作区设置提供筛选功能,您可以轻松创建一个表达式来隐藏这些派生文件
**/*.js: { "when": "$(basename).ts" }
此模式将匹配任何 JavaScript 文件 (**/*.js
),但前提是存在同名的同级 TypeScript 文件。如果 JavaScript 派生资源被编译到同一位置,文件资源管理器将不再显示这些资源。
在工作区 settings.json
文件中添加带有过滤器的 files.exclude
设置,该文件位于工作区根目录的 .vscode
文件夹中。您可以通过命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 中的首选项: 打开工作区设置 (JSON) 命令来打开工作区 settings.json
。
要排除从 .ts
和 .tsx
源文件生成的 JavaScript 文件,请使用此表达式
"files.exclude": {
"**/*.js": { "when": "$(basename).ts" },
"**/**.js": { "when": "$(basename).tsx" }
}
这是一个小技巧。glob 模式搜索用作键。上面的设置使用两个不同的 glob 模式来提供两个唯一的键,但搜索仍将匹配相同的文件。
使用较新版本的 TypeScript
VS Code 附带了最新稳定版本的 TypeScript 语言服务,默认情况下使用此版本在您的工作区中提供 IntelliSense。工作区版本的 TypeScript 独立于您用于编译 *.ts
文件的 TypeScript 版本。您可以直接使用 VS Code 的内置 TypeScript 版本进行 IntelliSense,而无需担心大多数常见情况,但有时您可能需要更改 VS Code 用于 IntelliSense 的 TypeScript 版本。
执行此操作的原因包括
- 通过切换到 TypeScript nightly build (
typescript@next
) 试用最新的 TypeScript 功能。 - 确保您使用的 TypeScript 版本与您用于编译代码的版本相同,以便进行 IntelliSense。
当您从语言状态栏中固定版本号并查看 TypeScript 文件时,活动 TypeScript 版本及其安装位置可以显示在状态栏中
如果您想更改工作区中 TypeScript 的默认版本,您有几个选项
使用工作区版本的 TypeScript
如果您的工作区具有特定的 TypeScript 版本,您可以在工作区版本的 TypeScript 和 VS Code 默认使用的版本之间切换,方法是打开 TypeScript 或 JavaScript 文件,然后单击状态栏中的 TypeScript 版本号。将出现一个消息框,询问您 VS Code 应使用哪个版本的 TypeScript
使用此选项可以在 VS Code 附带的 TypeScript 版本和工作区中的 TypeScript 版本之间切换。您还可以使用 TypeScript: 选择 TypeScript 版本命令触发 TypeScript 版本选择器。
VS Code 将自动检测工作区根目录下的 node_modules
中安装的工作区版本的 TypeScript。您还可以通过在您的用户或工作区设置中配置 typescript.tsdk
,显式告知 VS Code 要使用的 TypeScript 版本。typescript.tsdk
设置应指向包含 TypeScript tsserver.js
文件的目录。您可以使用 npm list -g typescript
找到 TypeScript 安装位置。tsserver.js
文件通常位于 lib
文件夹中。
例如
{
"typescript.tsdk": "/usr/local/lib/node_modules/typescript/lib"
}
提示:要获取特定的 TypeScript 版本,请在 npm 安装期间指定
@version
。例如,对于 TypeScript 3.6.0,您将使用npm install --save-dev typescript@3.6.0
。要预览 TypeScript 的下一个版本,请运行npm install --save-dev typescript@next
。
请注意,虽然 typescript.tsdk
在这些示例中指向 typescript
内的 lib
目录,但 typescript
目录必须是完整的 TypeScript 安装,其中包含 TypeScript package.json
文件。
您还可以通过添加指向 tsserver.js
文件目录的 typescript.tsdk
工作区设置,告知 VS Code 在特定工作区中使用特定版本的 TypeScript
{
"typescript.tsdk": "./node_modules/typescript/lib"
}
typescript.tsdk
工作区设置仅告知 VS Code 存在工作区版本的 TypeScript。要实际开始使用工作区版本进行 IntelliSense,您必须运行 TypeScript: 选择 TypeScript 版本命令并选择工作区版本。
使用 TypeScript nightly build
在 VS Code 中试用最新 TypeScript 功能的最简单方法是安装JavaScript 和 TypeScript Nightly 扩展。
此扩展会自动将 VS Code 的内置 TypeScript 版本替换为最新的 TypeScript nightly build。如果您已使用 TypeScript: 选择 TypeScript 版本命令配置了 TypeScript 版本,只需确保切换回使用 VS Code 的 TypeScript 版本。
混合 TypeScript 和 JavaScript 项目
混合 TypeScript 和 JavaScript 项目是可能的。要在 TypeScript 项目中启用 JavaScript,您可以在 tsconfig.json
中将 allowJs
属性设置为 true
。
提示:
tsc
编译器不会自动检测jsconfig.json
文件的存在。使用–p
参数使tsc
使用您的jsconfig.json
文件,例如tsc -p jsconfig.json
。
处理大型项目
如果您正在处理包含数百或数千个 TypeScript 文件的代码库,以下是一些您可以采取的步骤,以改善 VS Code 中的编辑体验以及命令行上的编译时间。
确保您的 tsconfig 仅包含您关心的文件
在您的项目的 tsconfig.json
中使用 include
或 files
,以确保项目仅包含应作为项目一部分的文件。
更多信息关于配置您的项目的 tsconfig.json
。
使用项目引用分解您的项目
与其将源代码构造为单个大型项目,不如使用项目引用将其分解为较小的项目来提高性能。这允许 TypeScript 一次仅加载您的代码库的子集,而不是加载整个代码库。
有关如何使用项目引用以及使用它们的最佳实践的详细信息,请参阅TypeScript 文档。
后续步骤
请继续阅读以了解
- 编辑 TypeScript - TypeScript 的特定编辑功能。
- 重构 TypeScript - 来自 TypeScript 语言服务的有用重构。
- 调试 TypeScript - 为您的 TypeScript 项目配置调试器。
常见问题
如何解决 TypeScript “无法编译外部模块”错误?
如果您收到该错误,请通过在项目的根文件夹中创建一个 tsconfig.json
文件来解决它。tsconfig.json 文件使您可以控制 Visual Studio Code 如何编译您的 TypeScript 代码。有关更多信息,请参阅 tsconfig.json 概述。
为什么我在 VS Code 中获得的错误和警告与我编译 TypeScript 项目时获得的错误和警告不同?
VS Code 附带了最新稳定版本的 TypeScript 语言服务,它可能与全局安装在计算机上或本地安装在工作区中的 TypeScript 版本不匹配。因此,您可能会看到编译器输出与活动 TypeScript 语言服务检测到的错误之间的差异。有关安装匹配的 TypeScript 版本的详细信息,请参阅使用较新版本的 TypeScript。
我可以使用 VS 2022 附带的 TypeScript 版本吗?
不可以,Visual Studio 2019 和 2022 附带的 TypeScript 语言服务与 VS Code 不兼容。您需要从 npm 安装单独的 TypeScript 版本。
为什么有些错误报告为警告?
默认情况下,VS Code TypeScript 将代码样式问题显示为警告而不是错误。这适用于
- 声明了变量但从未使用过
- 声明了属性但从未读取其值
- 检测到无法访问的代码
- 未使用的标签
- switch 中的 fall through case
- 并非所有代码路径都返回值
将这些视为警告与其他工具(如 TSLint)一致。当您从命令行运行 tsc
时,这些仍然会显示为错误。
您可以通过在您的用户设置中设置 "typescript.reportStyleChecksAsWarnings": false
来禁用此行为。