JavaScrit 註解
1. 格式
JavaScrit 中的註解有兩種格式。
單行註解:
|
|
多行註解:
|
|
2. 為什麼要加註解?
除非你的記得你幾個月前寫的程式,或能立刻明白他人寫的程式,否則良好的註解是必須的。
註解功能:
- 阻止程式碼執行。
- 用於說明程式碼,提升可讀性,方便專案管理、交接,提升協作效率。
3. 不必要的註解
- 只對商業邏輯複雜的部分撰寫註解
- 不要在程式碼中保留被註解掉的程式碼
- 不要留有日誌式的註解
- 避免位置標明
註解應用
1. 特殊標記註解
|
|
2. JSDoc
JSDoc 是最通用的 JavaScript 註解規範,透過特定格式的註解,可以快速建立 API 文件。
型別檢查
動態型別一時爽,程式碼重構火葬場
由於 Javascript 是動態型別語言,變數型別的寬容使得程式撰寫上有不錯的靈活性,但是當專案變得龐大時,反而會使開發成本提高。
使用 TypeScript 能有效解決動態型別的缺點,但考慮到學習成本與舊專案的重構,可試試 VSCode 中基於 TypeScript 提供對於 JSDoc 支持,實現智能型別檢查。
1. 開啟型別檢查
最簡單的方法就是在 .js 檔案開頭新增 @ts-check:
|
|
那麼 VSCode 就會根據註解檢查型別。
如果不想每隻 .js 檔案都加上 @ts-check,可以開啟 VSCode 全域型別檢查:
|
|
預設的情況下是關閉的:

如果型別檢查為開啟,則可以使用 @ts-nocheck 忽略某隻檔案的類型檢查:
|
|
2. jsconfig.json
除了啟用 VSCode 的設定來開啟型別檢查,也可以在專案根目錄下新增 jsconfig.json 設定檔:
|
|
jsconfig.json 會覆蓋 Implicit Project Config: Check JS 設定。
預設會全域檢查所有 .js 檔案,可以使用 exclude 或 include 選項,設定要排除或包含的資料夾:
|
|
Visual Studio Code - jsconfig.json
TypeScript - What is a tsconfig.json
3. 支持的 JSDoc 標籤
TypeScript 只支持了部分 JSDoc 標籤。
當前所支持的標籤如下:
@type@param(or@argor@argument)@returns(or@return)@typedef@callback@template@class(or@constructor)@this@extends(or@augments)@enum
3. 簡單範例
JSDoc 註解格式必須以 /** 為開頭才能被識別(例如 /*、/*** 不會被解析為 JSDoc 註解):
|
|
舉例來說,我們定義一個 count 變數:
|
|
我們可以指定任何型別的值給它,但如果希望它只接受數字型別,可以加上 JSDoc 註解:
|
|
若指定非數字型別的值,VSCode 將會跳出錯誤提示:

可以在註解第一行加上說明:
|
|

如果想要忽略類型錯誤可以使用 @ts-ignore。

JSDoc 標籤
1. @type
@type 可以用來標明變數型別。
基本用法:
|
|
複合型別:
|
|
指定陣列元素的型別:
|
|

也可以寫成 Array.<number>、Array<number>:
|
|
物件字面值:
|
|
指定 map-like 和 array-like 的物件:
|
|
預設就是 any 任意型別:
|
|
* 和 ? 等同 any:
|
|
函式型別:
|
|
2. @param(synonyms: @arg or @argument)
@param 語法和 @type 基本上相同,但用於標明函式參數,所以多了參數名稱。
|
|
函式如果有回傳值,則可以使用 @returns(@return) 標明。
有屬性的參數,使用物件字面值不易描述屬性:
|
|
可以使用以下寫法:
|
|
使用 ES6 參數解構,使用適當的參數名稱即可:
|
|
可選參數表示方式:
|
|
3. @typedef
@typedef 可以用來宣告複雜型別,也就是自訂義一個類型,再使用 @type 標記來引用。
描述一個物件型別:
|
|
4. @callback
@callback 與 @typedef 相似,但描述的是一個函式:
|
|
5. @class(synonyms: @constructor)
@class 可以標明函式為一個建構函式(Constructor)。
|
|
不過 ES6 有了 class 後,就沒必要使用 @class 了。
|
|
6. @this
@this 可以明確標示 this 關鍵字在這裡指的是什麼。
例如建構函式的方法:
|
|
或監聽器處理函式:
|
|
7. @extends(synonyms: @augments)
如果使用 extends 關鍵字來擴展一個現有的類別的時候,可以使用 @extends 標示。
|
|
8. @enum
@enum 標籤描述一個靜態屬性值的全部相同的集合,簡單來說就是一個物件內的屬性皆為相同型別,且不允許新增額外屬性。
|
|
9. @template
@templete 非 JSDoc 標準,只在 google closure compiler 中有提及,可以用來宣告 泛用型別(Generic Type),是 TypeScript 中的型別。
泛用型別(Generic Type) 目的在於成員之間提供有意義的約束,這些成員可以是類別的實體、類別的方法、函式參數、函式回傳值。
|
|

關於 泛用型別(Generic Type) 我自己也不是很了解,有空在補充。
註解相關 VSCode 套件
- koroFileHeader,在 VSCode 中用於生成檔案頭部註解和函式註解的套件。
- 文件頭部新增註解:
Ctrl+Alt+t - 光標處添加函式註解:
Ctrl+Alt+t
- 文件頭部新增註解:
- Todo Tree,特殊註解高光亮。
|
|
參考文獻
- 可不可以不要寫糙 code系列 第 8 篇 - 不必要的註解
- 编写高质量可维护的代码:一目了然的注释
- 導入 TypeScript 應考慮之效益與成本
- 為你的 JavaScript 項目添加智能提示和類型檢查
- [Vuex]在 Vscode 中不使用 Typescript 也能讓 Vuex 讀懂變數的類型
- JSDoc中文文档(@use JSDoc)
- 基于TypeScript的JSDoc注释
- @ts-check 立即上手,JSDoc 添加类型
- 如何使用 JSDoc 保證你的 Javascript 型別安全性
- TS in JS 实践指北
- [Web翻译]从JavaScript生成TypeScript定义文件
- [译] 讨论 JS ⚡:文档
- 使用 JSDoc 标注类型
- 利用 VSCode、JSDoc、d.ts 让你的代码更健壮
- ES6写JSDoc的一些经验和实例
- 震驚!JavaScript 竟然可以類型推斷!
- “無 Typescript” 編程
- JSDoc support in JavaScript
- JSDoc支持_TypeScript筆記19
- Typescript 初心者手札系列 第 3 篇 - TypeScript 編譯設定 - tsconfig.json
- vscode中的 jsconfig.json
- 為什麼世界需要Typescript系列 第 7 篇 - 泛型 - 07
- 你不知道的 TypeScript 泛型(萬字長文,建議收藏)
- TypeScript系列(四)泛型