TS 筆記二 tsconfig.json eslint

參考
了不起的 tsconfig.json 指南
tsconfig.json文件各字段吐血整理

一呕缭、簡(jiǎn)介
1. 什么是 tsconfig.json

TypeScript 使用 tsconfig.json 文件作為其配置文件功舀,當(dāng)一個(gè)目錄中存在 tsconfig.json 文件削罩,則認(rèn)為該目錄為 TypeScript 項(xiàng)目的根目錄。

2. 為什么使用 tsconfig.json

通常我們可以使用 tsc 命令來(lái)編譯少量 TypeScript 文件:

/*
  參數(shù)介紹:
  --outFile // 編譯后生成的文件名稱
  --target  // 指定ECMAScript目標(biāo)版本
  --module  // 指定生成哪個(gè)模塊系統(tǒng)代碼
  index.ts  // 源文件
*/
$ tsc --outFile leo.js --target es3 --module amd index.ts

但如果實(shí)際開發(fā)的項(xiàng)目,很少是只有單個(gè)文件耳奕,當(dāng)我們需要編譯整個(gè)項(xiàng)目時(shí)稚新,就可以使用 tsconfig.json 文件,將需要使用到的配置都寫進(jìn) tsconfig.json 文件锥惋,這樣就不用每次編譯都手動(dòng)輸入配置昌腰,另外也方便團(tuán)隊(duì)協(xié)作開發(fā)。

3.初始化 tsconfig.json

在初始化操作膀跌,也有 2 種方式:

  • 手動(dòng)在項(xiàng)目根目錄(或其他)創(chuàng)建 tsconfig.json 文件并填寫配置遭商;
  • 通過 tsc --init 初始化 tsconfig.json 文件。
二捅伤、實(shí)例
1.learnTsconfig/src/index.ts
// 返回當(dāng)前版本號(hào)
function getVersion(version:string = "1.0.0"): string{
    return version;
}

console.log(getVersion("1.0.1"))
2.初始化 tsconfig.json 文件

在 learnTsconfig 根目錄執(zhí)行:

E:\ts\learnTsconfig>tsc --init

Created a new tsconfig.json with:

  target: es2016
  module: commonjs
  strict: true
  esModuleInterop: true
  skipLibCheck: true
  forceConsistentCasingInFileNames: true


You can learn more at https://aka.ms/tsconfig.json
3.常用配置
{
  "compilerOptions": {
    "target": "ES5",             // 目標(biāo)語(yǔ)言的版本
    "module": "commonjs",        // 指定生成代碼的模板標(biāo)準(zhǔn)
    "noImplicitAny": true,       // 不允許隱式的 any 類型
    "removeComments": true,      // 刪除注釋 
    "preserveConstEnums": true,  // 保留 const 和 enum 聲明
    "sourceMap": true            // 生成目標(biāo)文件的sourceMap文件
  },
  "files": [   // 指定待編譯文件
    "./src/index.ts"  
  ]
}

files 配置項(xiàng)值是一個(gè)數(shù)組劫流,用來(lái)指定了待編譯文件,即入口文件。當(dāng)入口文件依賴其他文件時(shí)祠汇,不需要將被依賴文件也指定到 files 中仍秤,因?yàn)榫幾g器會(huì)自動(dòng)將所有的依賴文件歸納為編譯對(duì)象,即 index.ts 依賴 user.ts 時(shí)可很,不需要在 files 中指定 user.ts 诗力, user.ts 會(huì)自動(dòng)納入待編譯文件。

執(zhí)行tsc命令我抠,可以看到src文件下生成的js文件苇本,可以使用node src/index.js命令執(zhí)行。

三菜拓、compilerOptions 配置編譯選項(xiàng)
  • "incremental": true, // TS編譯器在第一次編譯之后會(huì)生成一個(gè)存儲(chǔ)編譯信息的文件瓣窄,第二次編譯會(huì)在第一次的基礎(chǔ)上進(jìn)行增量編譯,可以提高編譯的速度
  • "tsBuildInfoFile": "./buildFile", // 增量編譯文件的存儲(chǔ)位置
  • "diagnostics": true, // 打印診斷信息
  • "target": "ES5", // 目標(biāo)語(yǔ)言的版本
  • "module": "CommonJS", // 生成代碼的模板標(biāo)準(zhǔn)
  • "outFile": "./app.js", // 將多個(gè)相互依賴的文件生成一個(gè)文件尘惧,可以用在AMD模塊中康栈,即開啟時(shí)應(yīng)設(shè)置"module": "AMD",
  • "lib": ["DOM", "ES2015", "ScriptHost", "ES2019.Array"], // TS需要引用的庫(kù),即聲明文件喷橙,es5 默認(rèn)引用dom啥么、es5、scripthost,如需要使用es的高級(jí)版本特性贰逾,通常都需要配置悬荣,如es8的數(shù)組新特性需要引入"ES2019.Array",
  • "allowJS": true, // 允許編譯器編譯JS,JSX文件
  • "checkJs": true, // 允許在JS文件中報(bào)錯(cuò)疙剑,通常與allowJS一起使用
  • "outDir": "./dist", // 指定輸出目錄
  • "rootDir": "./", // 指定輸出文件目錄(用于輸出)氯迂,用于控制輸出目錄結(jié)構(gòu)
  • "declaration": true, // 生成聲明文件,開啟后會(huì)自動(dòng)生成聲明文件
  • "declarationDir": "./file", // 指定生成聲明文件存放目錄
  • "emitDeclarationOnly": true, // 只生成聲明文件言缤,而不會(huì)生成js文件
  • "sourceMap": true, // 生成目標(biāo)文件的sourceMap文件
  • "inlineSourceMap": true, // 生成目標(biāo)文件的inline SourceMap嚼蚀,inline SourceMap會(huì)包含在生成的js文件中
  • "declarationMap": true, // 為聲明文件生成sourceMap
  • "typeRoots": [], // 聲明文件目錄,默認(rèn)時(shí)node_modules/@types
  • "types": [], // 加載的聲明文件包
  • "removeComments":true, // 刪除注釋
  • "noEmit": true, // 不輸出文件,即編譯后不會(huì)生成任何js文件
  • "noEmitOnError": true, // 發(fā)送錯(cuò)誤時(shí)不輸出任何文件
  • "noEmitHelpers": true, // 不生成helper函數(shù)管挟,減小體積轿曙,需要額外安裝,常配合importHelpers一起使用
  • "importHelpers": true, // 通過tslib引入helper函數(shù)僻孝,文件必須是模塊
  • "downlevelIteration": true, // 降級(jí)遍歷器實(shí)現(xiàn)导帝,如果目標(biāo)源是es3/5,那么遍歷器會(huì)有降級(jí)的實(shí)現(xiàn)
  • "strict": true, // 開啟所有嚴(yán)格的類型檢查
  • "alwaysStrict": true, // 在代碼中注入'use strict'
  • "noImplicitAny": true, // 不允許隱式的any類型
  • "strictNullChecks": true, // 不允許把null穿铆、undefined賦值給其他類型的變量
  • "strictFunctionTypes": true, // 不允許函數(shù)參數(shù)雙向協(xié)變
  • "strictPropertyInitialization": true, // 類的實(shí)例屬性必須初始化
  • "strictBindCallApply": true, // 嚴(yán)格的bind/call/apply檢查
  • "noImplicitThis": true, // 不允許this有隱式的any類型
  • "noUnusedLocals": true, // 檢查只聲明您单、未使用的局部變量(只提示不報(bào)錯(cuò))
  • "noUnusedParameters": true, // 檢查未使用的函數(shù)參數(shù)(只提示不報(bào)錯(cuò))
  • "noFallthroughCasesInSwitch": true, // 防止switch語(yǔ)句貫穿(即如果沒有break語(yǔ)句后面不會(huì)執(zhí)行)
  • "noImplicitReturns": true, //每個(gè)分支都會(huì)有返回值
  • "esModuleInterop": true, // 允許export=導(dǎo)出,由import from 導(dǎo)入
  • "allowUmdGlobalAccess": true, // 允許在模塊中全局變量的方式訪問umd模塊
  • "moduleResolution": "node", // 模塊解析策略荞雏,ts默認(rèn)用node的解析策略虐秦,即相對(duì)的方式導(dǎo)入
  • "baseUrl": "./", // 解析非相對(duì)模塊的基地址平酿,默認(rèn)是當(dāng)前目錄
  • "paths": { // 路徑映射,相對(duì)于baseUrl
    // 如使用jq時(shí)不想使用默認(rèn)版本悦陋,而需要手動(dòng)指定版本染服,可進(jìn)行如下配置
    "jquery": ["node_modules/jquery/dist/jquery.min.js"]
    },
  • "rootDirs": ["src","out"], // 將多個(gè)目錄放在一個(gè)虛擬目錄下,用于運(yùn)行時(shí)叨恨,即編譯后引入文件的位置可能發(fā)生變化,這也設(shè)置可以虛擬src和out在同一個(gè)目錄下挖垛,不用再去改變路徑也不會(huì)報(bào)錯(cuò)
  • "listEmittedFiles": true, // 打印輸出文件
  • "listFiles": true// 打印編譯的文件(包括引用的聲明文件)
1.延遲初始化 strictPropertyInitialization

參考
ts 更嚴(yán)格的類屬性檢查

Typescript 2.7 引入了一個(gè)新的控制嚴(yán)格性的標(biāo)記 –strictPropertyInitialization, 這個(gè)參數(shù)在 tsconfig.ts 中來(lái)配置

開啟方式:

"strictNullChecks": true
"strictPropertyInitialization": true

作用

  • 使用這個(gè)標(biāo)記會(huì)確保類的每個(gè)實(shí)例屬性都會(huì)在構(gòu)造函數(shù)里或使用屬性初始化器賦值痒钝。
  • 它會(huì)明確地進(jìn)行從變量到類的實(shí)例屬性的賦值檢查

舉例

class C {
  foo: number;
  bar = "hello";
  baz: boolean;
  constructor() {
    this.foo = 42;
  }
}

上述代碼,首先編輯器會(huì)報(bào)錯(cuò): 屬性“baz”沒有初始化表達(dá)式痢毒,且未在構(gòu)造函數(shù)中明確賦值送矩。ts(2564)
其次在編譯報(bào)錯(cuò):error TS2564: Property 'baz' has no initializer and is not definitely assigned in the constructor.

兩種都告訴開發(fā)者哪替,應(yīng)該給 baz 顯示賦值栋荸,但是某種情況下,在初始化的時(shí)候我們并不想賦值凭舶,更期望是 undefined晌块,而后再去賦值,此時(shí) !: 就派上用場(chǎng)了帅霜。

在上述代碼中 屬性 baz 冒號(hào)之前加上 ! ,這樣就不會(huì)報(bào)錯(cuò)了

class C {
  foo: number;
  bar = "hello";
  baz!: boolean;
  constructor() {
    this.foo = 42;
  }
}
四匆背、eslint

參考
放棄 TSLint,使用 ESLint
TypeScript如何使用ESLint進(jìn)行代碼檢測(cè)

1.放棄 TSLint

ESLint 支持 ECMAScript 和 JavaScript身冀,而 TSLint 僅支持 TypeScript钝尸。因此,TSLint 官方已經(jīng)于 2019 年放棄了 TSLint搂根,轉(zhuǎn)而呼吁開發(fā)者們使用 ESLint 作為替代珍促。

https://palantir.github.io/tslint/
warning: TSLint has been deprecated as of 2019. Please see this issue for more details: Roadmap: TSLint → ESLint. typescript-eslint is now your best option for linting TypeScript.

2.實(shí)踐

參考
ESLint 使用簡(jiǎn)介

先在VSCODE中安裝eslint插件,并重啟剩愧。新建一個(gè)Test.ts如下:

export class Test{
    private a:number;

    constructor(){

    }

    private fun1():void{
        console.log(this.a);
    }
}

現(xiàn)在猪叙,先使用eslint -v檢查一下,如果沒有安裝隙咸,則需要進(jìn)行全局安裝:

npm i eslint -g

D:\ts\HelloWorld>eslint -v
v8.10.0

然后就可以使用eslint --init來(lái)初始化配置文件了:

D:\ts\HelloWorld>eslint --init
You can also run this command directly using 'npm init @eslint/config'.
Need to install the following packages:
  @eslint/create-config
Ok to proceed? (y)

看來(lái)這里最新的版本初始化命令有所變化沐悦,可以參考前端代碼規(guī)范化之create-react-app項(xiàng)目添加eslint

選了yes后,開始回答問題五督,注意紅框處藏否,問我們項(xiàng)目是不是在用TypeScript,這里選Yes充包,后面又提示安裝ts-eslint相關(guān)內(nèi)容副签。


image.png
D:\ts\HelloWorld>eslint src/Test.ts

D:\ts\HelloWorld\src\Test.ts
  2:13  error  Parsing error: Unexpected token a

? 1 problem (1 error, 0 warnings)
3.更復(fù)雜的配置

參考
在TypeScript項(xiàng)目中使用ESLint遥椿,看這篇就夠了
VS Code下Eslint+Prettier+TypeScript一步到位(規(guī)范配置)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市淆储,隨后出現(xiàn)的幾起案子冠场,更是在濱河造成了極大的恐慌,老刑警劉巖本砰,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碴裙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡点额,警方通過查閱死者的電腦和手機(jī)舔株,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)还棱,“玉大人载慈,你說(shuō)我怎么就攤上這事≌涫郑” “怎么了办铡?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)琳要。 經(jīng)常有香客問我寡具,道長(zhǎng),這世上最難降的妖魔是什么稚补? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任晒杈,我火速辦了婚禮,結(jié)果婚禮上孔厉,老公的妹妹穿的比我還像新娘拯钻。我一直安慰自己,他們只是感情好撰豺,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布粪般。 她就那樣靜靜地躺著,像睡著了一般污桦。 火紅的嫁衣襯著肌膚如雪亩歹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天凡橱,我揣著相機(jī)與錄音小作,去河邊找鬼。 笑死稼钩,一個(gè)胖子當(dāng)著我的面吹牛顾稀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坝撑,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼静秆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼粮揉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起抚笔,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扶认,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后殊橙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辐宾,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年膨蛮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了螃概。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸽疾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出训貌,到底是詐尸還是另有隱情制肮,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布递沪,位于F島的核電站豺鼻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏款慨。R本人自食惡果不足惜儒飒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望檩奠。 院中可真熱鬧桩了,春花似錦、人聲如沸埠戳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)整胃。三九已至颗圣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屁使,已是汗流浹背在岂。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛮寂,地道東北人蔽午。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像酬蹋,于是被迫代替她去往敵國(guó)和親祠丝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疾呻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容