TypeScript 詳解之 tsconfig.json

簡(jiǎn)介

tsconfig.json是 TypeScript 項(xiàng)目的配置文件,放在項(xiàng)目的根目錄。反過(guò)來(lái)說(shuō),如果一個(gè)目錄里面有tsconfig.json,TypeScript 就認(rèn)為這是項(xiàng)目的根目錄。

如果項(xiàng)目源碼是 JavaScript,但是想用 TypeScript 處理,那么配置文件的名字是jsconfig.json,它跟tsconfig的寫(xiě)法是一樣的。

tsconfig.json文件主要供tsc編譯器使用,它的命令行參數(shù)--project-p可以指定tsconfig.json的位置(目錄或文件皆可)。

$ tsc -p ./dir

如果不指定配置文件的位置,tsc就會(huì)在當(dāng)前目錄下搜索tsconfig.json文件,如果不存在,就到上一級(jí)目錄搜索,直到找到為止。

tsconfig.json文件的格式,是一個(gè) JSON 對(duì)象,最簡(jiǎn)單的情況可以只放置一個(gè)空對(duì)象{}。下面是一個(gè)示例。

{
  "compilerOptions": {
    "outDir": "./built",
    "allowJs": true,
    "target": "es5"
  },
  "include": ["./src/**/*"]
}

本章后面會(huì)詳細(xì)介紹tsconfig.json的各個(gè)屬性,這里簡(jiǎn)單說(shuō)一下,上面示例的四個(gè)屬性的含義。

  • include:指定哪些文件需要編譯。
  • allowJs:指定源目錄的 JavaScript 文件是否原樣拷貝到編譯后的目錄。
  • outDir:指定編譯產(chǎn)物存放的目錄。
  • target:指定編譯產(chǎn)物的 JS 版本。

tsconfig.json文件可以不必手寫(xiě),使用 tsc 命令的--init參數(shù)自動(dòng)生成。

$ tsc --init

上面命令生成的tsconfig.json文件,里面會(huì)有一些默認(rèn)配置。

你也可以使用別人預(yù)先寫(xiě)好的 tsconfig.json 文件,npm 的@tsconfig名稱(chēng)空間下面有很多模塊,都是寫(xiě)好的tsconfig.json樣本,比如 @tsconfig/recommended@tsconfig/node16

這些模塊需要安裝,以@tsconfig/deno為例。

$ npm install --save-dev @tsconfig/deno
# 或者
$ yarn add --dev @tsconfig/deno

安裝以后,就可以在tsconfig.json里面引用這個(gè)模塊,相當(dāng)于繼承它的設(shè)置,然后進(jìn)行擴(kuò)展。

{
  "extends": "@tsconfig/deno/tsconfig.json"
}

@tsconfig空間下包含的完整 tsconfig 文件目錄,可以查看 GitHub。

tsconfig.json的一級(jí)屬性并不多,只有很少幾個(gè),但是compilerOptions屬性有很多二級(jí)屬性。下面先逐一介紹一級(jí)屬性,然后再介紹compilerOptions的二級(jí)屬性,按照首字母排序。

exclude

exclude屬性是一個(gè)數(shù)組,必須與include屬性一起使用,用來(lái)從編譯列表中去除指定的文件。它也支持使用與include屬性相同的通配符。

{
  "include": ["**/*"],
  "exclude": ["**/*.spec.ts"]
}

extends

tsconfig.json可以繼承另一個(gè)tsconfig.json文件的配置。如果一個(gè)項(xiàng)目有多個(gè)配置,可以把共同的配置寫(xiě)成tsconfig.base.json,其他的配置文件繼承該文件,這樣便于維護(hù)和修改。

extends屬性用來(lái)指定所要繼承的配置文件。它可以是本地文件。

{
  "extends": "../tsconfig.base.json"
}

如果extends屬性指定的路徑不是以./../開(kāi)頭,那么編譯器將在node_modules目錄下查找指定的配置文件。

extends屬性也可以繼承已發(fā)布的 npm 模塊里面的 tsconfig 文件。

{
  "extends": "@tsconfig/node12/tsconfig.json"
}

extends指定的tsconfig.json會(huì)先加載,然后加載當(dāng)前的tsconfig.json。如果兩者有重名的屬性,后者會(huì)覆蓋前者。

files

files屬性指定編譯的文件列表,如果其中有一個(gè)文件不存在,就會(huì)報(bào)錯(cuò)。

它是一個(gè)數(shù)組,排在前面的文件先編譯。

{
  "files": ["a.ts", "b.ts"]
}

該屬性必須逐一列出文件,不支持文件匹配。如果文件較多,建議使用includeexclude屬性。

include

include屬性指定所要編譯的文件列表,既支持逐一列出文件,也支持通配符。文件位置相對(duì)于當(dāng)前配置文件而定。

{
  "include": ["src/**/*", "tests/**/*"]
}

include屬性支持三種通配符。

  • ?:指代單個(gè)字符
  • *:指代任意字符,不含路徑分隔符
  • **:指定任意目錄層級(jí)。

如果不指定文件后綴名,默認(rèn)包括.ts.tsx.d.ts文件。如果打開(kāi)了allowJs,那么還包括.js.jsx。

references

references屬性是一個(gè)數(shù)組,數(shù)組成員為對(duì)象,適合一個(gè)大項(xiàng)目由許多小項(xiàng)目構(gòu)成的情況,用來(lái)設(shè)置需要引用的底層項(xiàng)目。

{
  "references": [
    { "path": "../pkg1" },
    { "path": "../pkg2/tsconfig.json" }
  ]
}

references數(shù)組成員對(duì)象的path屬性,既可以是含有文件tsconfig.json的目錄,也可以直接是該文件。

與此同時(shí),引用的底層項(xiàng)目的tsconfig.json必須啟用composite屬性。

{
  "compilerOptions": {
    "composite": true
  }
}

compileOptions

compilerOptions屬性用來(lái)定制編譯行為。這個(gè)屬性可以省略,這時(shí)編譯器將使用默認(rèn)設(shè)置。

allowJs

allowJs允許 TypeScript 項(xiàng)目加載 JS 腳本。編譯時(shí),也會(huì)將 JS 文件,一起拷貝到輸出目錄。

{
  "compilerOptions": {
    "allowJs": true
  }
}

alwaysStrict

alwaysStrict確保腳本以 ECMAScript 嚴(yán)格模式進(jìn)行解析,因此腳本頭部不用寫(xiě)"use strict"。它的值是一個(gè)布爾值,默認(rèn)為true

allowSyntheticDefaultImports

allowSyntheticDefaultImports允許import命令默認(rèn)加載沒(méi)有default輸出的模塊。

比如,打開(kāi)這個(gè)設(shè)置,就可以寫(xiě)import React from "react";,而不是import * as React from "react";。

allowUnreachableCode

allowUnreachableCode設(shè)置是否允許存在不可能執(zhí)行到的代碼。它的值有三種可能。

  • undefined: 默認(rèn)值,編輯器顯示警告。
  • true:忽略不可能執(zhí)行到的代碼。
  • false:編譯器報(bào)錯(cuò)。

allowUnusedLabels

allowUnusedLabels設(shè)置是否允許存在沒(méi)有用到的代碼標(biāo)簽(label)。它的值有三種可能。

  • undefined: 默認(rèn)值,編輯器顯示警告。
  • true:忽略沒(méi)有用到的代碼標(biāo)簽。
  • false:編譯器報(bào)錯(cuò)。

baseUrl

baseUrl的值為字符串,指定 TypeScript 項(xiàng)目的基準(zhǔn)目錄。

由于默認(rèn)是以 tsconfig.json 的位置作為基準(zhǔn)目錄,所以一般情況不需要使用該屬性。

{
  "compilerOptions": {
    "baseUrl": "./"
  }
}

上面示例中,baseUrl為當(dāng)前目錄./。那么,當(dāng)遇到下面的語(yǔ)句,TypeScript 將以./為起點(diǎn),尋找hello/world.ts

import { helloWorld } from "hello/world";

checkJs

checkJS設(shè)置對(duì) JS 文件同樣進(jìn)行類(lèi)型檢查。打開(kāi)這個(gè)屬性,也會(huì)自動(dòng)打開(kāi)allowJs。它等同于在 JS 腳本的頭部添加// @ts-check命令。

{
  "compilerOptions":{
    "checkJs": true
  }
}

composite

composite打開(kāi)某些設(shè)置,使得 TypeScript 項(xiàng)目可以進(jìn)行增量構(gòu)建,往往跟incremental屬性配合使用。

declaration

declaration設(shè)置編譯時(shí)是否為每個(gè)腳本生成類(lèi)型聲明文件.d.ts。

{
  "compilerOptions": {
    "declaration": true
  }
}

declarationDir

declarationDir設(shè)置生成的.d.ts文件所在的目錄。

{
  "compilerOptions": {
    "declaration": true,
    "declarationDir": "./types"
  }
}

declarationMap

declarationMap設(shè)置生成.d.ts類(lèi)型聲明文件的同時(shí),還會(huì)生成對(duì)應(yīng)的 Source Map 文件。

還有 66% 的精彩內(nèi)容
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
支付 ¥6.99 繼續(xù)閱讀

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容