大家可能常常會遇到這樣的場景:
- 你調(diào)用一個別人寫的函數(shù)苔巨,很不幸咬扇,這個家伙沒有留下任何注釋此熬,為了搞清楚參數(shù)類型,你只能硬著頭皮去看里面的邏輯
- 明明定義好了接口譬嚣,可一聯(lián)調(diào)就報錯了----“TypeError:Cannot read property 'length' of undefined"耙蔑。
歸根結(jié)底,這是因為javascript是一門動態(tài)弱類型語音孤荣,對變量的類型非常寬容,不會在這些變量和他們的調(diào)用者之間建立結(jié)構化的契約须揣。
var name = 'James';
var sum = 1 + 2;
name = sum;
該 name 變量開始“存有”一個字符串盐股,但現(xiàn)在它“存有”一個數(shù)字。這凸顯了 JavaScript 中變量和類型的基本特性
相比之下耻卡,我們可以將“靜態(tài)類型語言”typescript視為我們可以(也必須)將類型信息與特定變量相關聯(lián)的語言:
var name: string = ‘James’;
在這段代碼中疯汁,我們能夠更好地顯式聲明我們對變量 name 的意圖,我們希望它總是用作一個字符串卵酪。
TypeScript 的靜態(tài)類型注釋給我們的一個巨大的幫助幌蚊,它能夠清楚地表達我們對變量的意圖。這種改進不僅有益于 TypeScript 編譯器溃卡,還可以讓我們的同事和將來的自己明白我們的代碼溢豆。代碼是用來讀的。
var name: string = 'James';
var sum: number = 1 + 2;
name = sum;
如果我們使用 TypeScript 編譯器編譯這個代碼瘸羡,我們現(xiàn)在就會收到一個在 name = sum 這行的錯誤: Type 'number' is not assignable to type 'string'漩仙,我們的這種“偷渡”被警告,我們執(zhí)行的代碼可能有問題犹赖。重要的是队他,如果我們想要繼續(xù)執(zhí)行,我們可以選擇忽略 TypeScript 編譯器的錯誤峻村,因為它只是在將 JavaScript 代碼發(fā)送給我們的用戶之前給我們反饋的工具麸折。
那么坠韩,TypeScript究竟有哪些特性使得它成為大家的“剛需”
1悯衬,類型檢查。TypeScript會在編譯代碼時進行嚴格的靜態(tài)類型檢查艘刚。這意味著你可以在編碼階段發(fā)現(xiàn)可能存在的隱患雾棺,而不必把他們帶到線上膊夹。
2,語言擴展捌浩。TypeScript會包括來自ES6和未來提案中的特性放刨。
3,工具屬性尸饺。TypeScript能夠編譯成標準的javascript进统,無需運行時的任何額外開銷
4,IDE 智能提示助币。TypeScript 不僅自己寫的類庫有豐富的類型信息, 也可以對其他純 JS 項目進行類型標注 (DefinitelyTyped), 便于使用者直接在 IDE 中瀏覽 API, 效率大增.
tsconfig.json常用配置項:
{
"compilerOptions": {
"allowUnreachableCode": true, // 不報告執(zhí)行不到的代碼錯誤。
"allowUnusedLabels": false, // 不報告未使用的標簽錯誤
"alwaysStrict": false, // 以嚴格模式解析并為每個源文件生成 "use strict"語句
"baseUrl": ".", // 工作根目錄
"experimentalDecorators": true, // 啟用實驗性的ES裝飾器
"jsx": "react", // 在 .tsx文件里支持JSX
"sourceMap": true, // 是否生成map文件
"module": "commonjs", // 指定生成哪個模塊系統(tǒng)代碼
"noImplicitAny": false, // 是否默認禁用 any
"removeComments": true, // 是否移除注釋
"types": [ //指定引入的類型聲明文件螟碎,默認是自動引入所有聲明文件眉菱,一旦指定該選項,則會禁用自動引入掉分,改為只引入指定的類型聲明文件俭缓,如果指定空數(shù)組[]則不引用任何文件
"node", // 引入 node 的類型聲明
],
"paths": { // 指定模塊的路徑,和baseUrl有關聯(lián)酥郭,和webpack中resolve.alias配置一樣
"src": [ //指定后可以在文件之直接 import * from 'src';
"./src"
],
},
"target": "ESNext", // 編譯的目標是什么版本的
"outDir": "./dist", // 輸出目錄
"declaration": true, // 是否自動創(chuàng)建類型聲明文件
"declarationDir": "./lib", // 類型聲明文件的輸出目錄
"allowJs": true, // 允許編譯javascript文件华坦。
"lib": [ // 編譯過程中需要引入的庫文件的列表
"es5",
"es2015",
"es2016",
"es2017",
"es2018",
"dom"
]
},
// 指定一個匹配列表(屬于自動指定該路徑下的所有ts相關文件)
"include": [
"src/**/*"
],
// 指定一個排除列表(include的反向操作)
"exclude": [
"demo.ts"
],
// 指定哪些文件使用該配置(屬于手動一個個指定文件)
"files": [
"demo.ts"
]
}