前两天写了篇文章,喷 TypeScript 太过难用了,不过难用也得学啊,主要是因为我用过静态强类型语言,在项目规模变大的时候,确实对项目的质量把控是有帮助的,这可能就是后端程序员学习前端的迷信吧。反正我认识一个资深的前端朋友,他就反感且他自己也不会选择 TypeScript,他说自己很有自信能写对,也知道自己在写些什么,好吧。
那么 TypeScript 为什么那么痛苦呢?我觉得根本原因还是 javascript
这个语言,本身是一个弱类型动态语言,原生就不支持类型之类的事情,而 TypeScript 又选择了不破坏它的核心,只是渐进式增补类型到代码里。所以,就处处要照顾原有的一些设定。
好吧好吧,书归正言,本文打算介绍 Vue 3 项目中,如果运用 TypeScript 的话,如何配置 tsconfig.json
。上次我们已经从官方脚手架,创建了一个 Vue 3 + TypeScript 的项目,这个脚手架其实很有价值,比如,里面就提供了一套 tsconfig
的配置,通过学习这个配置,我们可以了解一些 TypeScript 在项目中的正确用法。
一、tsconfig.json
的作用
我们在项目中使用 TypeScript 的时候,实际执行还是 javascript
,所以要想执行,先需要编译,将代码进行转换:
tsc source.ts
这是处理单个代码文件的时候的做法,不过,一般我们项目里都有成百上千的源码文件,不可能一个一个去处理,这时候就需要用 tsconfig.json
告诉编译器,或者一些处理工具,如何处理 TypeScript 的问题。
通过此配置文件,我们可以告诉编译器,编译的选项,需要处理的文件集合,目标文件的目录等等。
{
"compilerOptions": {
"target": "ES5", // 目标语言的版本
"module": "commonjs", // 指定生成代码的模板标准
"noImplicitAny": true, // 不允许隐式的 any 类型
"removeComments": true, // 删除注释
"preserveConstEnums": true, // 保留 const 和 enum 声明
"sourceMap": true // 生成目标文件的sourceMap文件
},
"files": [ // 指定待编译文件
"./src/index.ts"
]
}
这是一个典型的 tsconfig.json
。
二、基本介绍
tsconfig.json
的顶层字段有:
- compileOnSave 行为开关
- compilerOptions 编译选项
- exclude 排除一些文件
- extends 继承一份配置
- files 文件列表
- include 包括的文件
- references 项目引用,配置可以切成多块来分别设置
- typeAcquisition 本项目中的自动类型检查,2.1 以上支持
最重要的是编译选项,常用的一些大概有:
{
// ...
"compilerOptions": {
"incremental": true, // TS编译器在第一次编译之后会生成一个存储编译信息的文件,第二次编译会在第一次的基础上进行增量编译,可以提高编译的速度
"tsBuildInfoFile": "./buildFile", // 增量编译文件的存储位置
"diagnostics": true, // 打印诊断信息
"target": "ES5", // 目标语言的版本
"module": "CommonJS", // 生成代码的模板标准
"outFile": "./app.js", // 将多个相互依赖的文件生成一个文件,可以用在AMD模块中,即开启时应设置"module": "AMD",
"lib": ["DOM", "ES2015", "ScriptHost", "ES2019.Array"], // TS需要引用的库,即声明文件,es5 默认引用dom、es5、scripthost,如需要使用es的高级版本特性,通常都需要配置,如es8的数组新特性需要引入"ES2019.Array",
"allowJS": true, // 允许编译器编译JS,JSX文件
"checkJs": true, // 允许在JS文件中报错,通常与allowJS一起使用
"outDir": "./dist", // 指定输出目录
"rootDir": "./", // 指定输出文件目录(用于输出),用于控制输出目录结构
"declaration": true, // 生成声明文件,开启后会自动生成声明文件
"declarationDir": "./file"