問題解析有JSDoc還需要TypeScript嗎
引言
這聽起來是不是很耳熟:你想寫一個(gè)小型腳本,不管是為頁面、命令行工具,還是其他什么類型。你從JavaScript開始,直到你想起寫代碼時(shí)沒有類型是多么痛苦。所以你把文件從.js
重命名為.ts
。然后意識(shí)到你已經(jīng)打開了一個(gè)麻煩的玩意兒。
如果你在為一個(gè)網(wǎng)站或一個(gè)庫寫代碼,你就需要引入編譯的步驟。如果你在編寫CLI腳本,你可以求助于Deno(它支持TypeScript,開箱即用),但是你需要設(shè)置你的IDE來理解Deno的API,而且混合和匹配Deno和node并不總是那么容易。
一旦你在本地完成了所有工作,你就需要考慮如何分發(fā)你的代碼。你會(huì)檢查你編譯的.js
文件嗎?你會(huì)創(chuàng)建一個(gè)CI管道來自動(dòng)編譯你的.ts
文件嗎?如果你在寫一個(gè)庫,你如何發(fā)布你的庫,以便它可以被其他項(xiàng)目使用?
你實(shí)際上不需要TypeScript
問題是......你不需要為了獲得靜態(tài)類型分析而編寫TypeScript!
你可以通過使用JSDoc在JavaScript中獲得TypeScript的所有好處
TypeScript所提供的是一個(gè)靜態(tài)類型系統(tǒng)。這意味著類型信息在運(yùn)行代碼中沒有影響。當(dāng)你的TypeScript被執(zhí)行時(shí),所有的類型信息都會(huì)完全丟失(這就是為什么你不寫一個(gè)類型守衛(wèi),就不能測(cè)試一個(gè)變量是否是某個(gè)類型的原因)。
這也意味著TypeScript只是提供給TypeScript分析器的額外類型信息,對(duì)運(yùn)行你代碼的JavaScript引擎沒有任何意義。當(dāng)你把TypeScript編譯成JavaScript時(shí),它基本上只是從你的代碼中刪除了所有的類型信息,所以它又變成了有效的JavaScript代碼。
JSDoc
在JavaScript誕生25年多后,JSDoc作為一種注釋JavaScript代碼的方式被引入。它是一種正式的標(biāo)記語言,允許IDE在開發(fā)者看到一個(gè)函數(shù)時(shí)提供額外的上下文。
類似的注釋標(biāo)記存在于大多數(shù)語言中,我相信你已經(jīng)知道它了。這就是它的樣子:
/** * This is the JSDOC block. IDEs will show this text when you hover the * printName function. * * @param {string} name */ function printName(name) { console.log(name) }
TypeScript 和 JSDoc
較少人知道的是,JSDoc是你充分使用TypeScript所需要的。TypeScript分析器能夠理解用JSDoc寫的類型,并給你提供與.ts
文件相同的靜態(tài)分析。
我不會(huì)在這里提供完整的語法文檔。最重要的是你要知道,幾乎所有你能在.ts
文件中做的事情,你都能用JSDoc來做。但這里有幾個(gè)例子:
帶有原生類型的函數(shù)參數(shù):
/** * @param {string} a * @param {number} b */ function foo(a, b) {}
使用TypeScript提供的開箱即用的類型:
/** * @param {HTMLElement} element * @param {Window} window */ function foo(element, window) {} /** @type {number[]} */ let years
定義對(duì)象字面量和函數(shù):
/** @type {{ name: string; age: number }} */ let person /** @type {(s: string, b: boolean) => void} */ let myCallback
從*.d.ts
文件中導(dǎo)入類型:
/** @param {import('./types').User} user */ const deleteUser = (user) => {}
定義一個(gè)類型供以后使用:
/** * @typedef {object} Color * @property {number} chroma * @property {number} hue */ /** @type {Color[]} */ const colors = [ { chroma: 0.2, hue: 262 }, { chroma: 0.2, hue: 28.3 }, ]
參見官方TypeScript JSDoc文檔以獲得詳盡的列表。
如果你有復(fù)雜的類型,你仍然可以編寫你的*.d.ts
文件并在你的JSDoc注釋中導(dǎo)入它們。
注意,你仍然需要為typescript設(shè)置你的項(xiàng)目(和IDE),你需要?jiǎng)?chuàng)建一個(gè)tsconfig.json
文件,將編譯器選項(xiàng)allowJs
和checkJs
設(shè)置為true
:
// tsconfig.json { "compilerOptions": { "allowJs": true, "checkJs": true // ... } }
什么時(shí)候?qū)慣ypeScript
雖然完全使用JSDoc進(jìn)行類型聲明是可能的,但這并不是最方便的。TypeScript的語法要好得多,而且不那么重復(fù)。
TypeScript團(tuán)隊(duì)創(chuàng)建了一個(gè)"作為注釋的類型"ECMAScript提案,允許你編寫TypeScript并在不修改的情況下在JavaScript引擎中運(yùn)行(JavaScript引擎將把這些類型注釋視為注釋。)
但是在這個(gè)提案被接受之前,我們只能決定使用JSDoc或者TypeScript工具鏈。
建議
所以現(xiàn)在我的建議是這樣的:
- 當(dāng)你正在做一個(gè)有編譯步驟的項(xiàng)目時(shí),使用TypeScript沒有什么壞處
- 但是如果你不需要編譯步驟,那么堅(jiān)持使用JSDoc類型注釋可能更容易。
原文翻譯自 https://www.pausly.app/blog/full-type-support-with-plain-javascript
以上就是問題解析有JSDoc還需要TypeScript嗎的詳細(xì)內(nèi)容,更多關(guān)于JSDoc TypeScript解析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
js實(shí)現(xiàn)文字超出部分用省略號(hào)代替實(shí)例代碼
關(guān)于超出一定字?jǐn)?shù)用省略號(hào)顯示的問題,這種要求在我們?nèi)粘i_發(fā)的時(shí)候經(jīng)常見到,我們之前基本都是用CSS來完成的,今天給大家分享個(gè)Javascript實(shí)現(xiàn)這個(gè)功能的示例代碼,有需要的可以參考借鑒。2016-09-09詳解微信小程序-掃一掃 wx.scanCode() 掃碼大變身
這篇文章主要介紹了微信小程序-掃一掃wx.scanCode() 掃碼大變身,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04JavaScript 實(shí)現(xiàn)打印,打印預(yù)覽,打印設(shè)置
這篇文章主要介紹了JavaScript 實(shí)現(xiàn)打印,打印預(yù)覽,打印設(shè)置的方法及示例分享,需要的朋友可以參考下2014-12-12線路分流自動(dòng)跳轉(zhuǎn)代碼;希望對(duì)大家有用!
線路分流自動(dòng)跳轉(zhuǎn)代碼;希望對(duì)大家有用!...2006-12-12JavaScript實(shí)現(xiàn)密碼框驗(yàn)證信息
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)密碼框驗(yàn)證信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11canvas實(shí)現(xiàn)粒子時(shí)鐘效果
本文將使用canvas實(shí)現(xiàn)粒子時(shí)鐘效果,具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-02-02JavaScript實(shí)現(xiàn)點(diǎn)擊出現(xiàn)子菜單效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)點(diǎn)擊出現(xiàn)子菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02