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@arg
or@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系列(四)泛型