vscode的智能提示規律是怎麼樣的?怎麼加強有用的智能提示屏蔽沒用的代碼提示?這篇文章將一一解答。
java
1.智能提示與代碼跳轉 c++
將鼠標懸停在代碼處,凡是能出現智能提示的地方,都能經過 ctrl + 鼠標左鍵 的方式跳轉到它的定義處,若是有多個定義,則會讓你選擇跳轉到哪裏。
api
懸停顯示:
微信
ctrl + 鼠標左鍵,代碼跳轉:函數
2.哪些代碼會提示,哪些會屏蔽
ui
對於同一個文件的代碼來講,全部代碼邏輯能訪問到的代碼均可以得到智能提示。
spa
依次獲取函數內變量,類裏面的函數,文件裏面的變量,這3者從代碼邏輯來講都能獲取,因此也能顯示對應的智能提示。反之,代碼邏輯不能獲取的不只沒有智能提示,並且會報錯:
.net
onLoad函數裏面訪問不到函數 newJourney裏面的局部變量 b,因此報錯。插件
不一樣文件間的智能提示是怎麼樣的呢?code
1.若是一個文件裏面沒有 import,require,export,export default等導入導出語句,那麼這個文件就會被當作全局文件對待,它的全部頂層數據都會暴露給其餘文件,其餘文件能獲取它的全部頂層數據的智能提示,可是邏輯上不必定能直接訪問(這是一個須要特別注意的點,後面會說明)。如:
在其餘任意文件能夠直接獲取上面數據的智能提示:
對於有 import,require,export,export default 等導入導出語句的文件,他們會被當作模塊,此時只有 export,export default 的那些數據會被外部訪問到,並且vscode會幫你自動寫import導入語句,如:
上面文件只有Home類能被外部訪問到:
訪問Home.ts文件裏面的頂層數據test會報錯。
總結起來就是一句話:有導入導出語句的文件,只有導出部分能暴露給外面訪問,沒有導入導出的普通文件,全部定義的頂層數據都能被外面訪問而得到智能提示。
注意點:對於沒有導入導出語句的普通文件,這裏的能被訪問只是表現層面的能夠訪問(也就是能獲取它的智能提示),邏輯層面其實並不能。因此爲了達到表現和邏輯的統一,能夠經過window這個全局對象來處理。以下,怎麼簡潔優雅的寫一個全局單例模塊用於封裝通用api:
上述文件1處定義了一個單例對象GNum,GNum是一個頂層數據,根據上面的分析,其餘文件能夠獲取GNum的智能提示。當咱們在其餘文件輸入GNum的時候能夠得到這個對象及其下面全部公有函數和屬性的智能提示,之因此用 new class 這種匿名類的寫法是不想額外暴露一個咱們不必暴露的類名給外面。
這個時候其餘文件就能夠獲取GNum的智能提示了,可是邏輯上GNum並非全局的,怎麼把智能提示的表現和邏輯統一呢?請看關鍵的一句2,2處定義了一個window下面的屬性「GNum」指向GNum,此時當咱們在一個文件裏面輸入GNum的時候,智能提示實際上是1處的,可是邏輯用的又是window下面的「GNum」,「GNum」指向1處的GNum, 因此這樣就作到了邏輯和表現的統一了,以下:
運行結果:
這樣寫出來的全局模塊,簡潔優雅,智能提示充足,其餘任意文件能夠直接調用api而不須要寫各類import語句,就像調用cc.xxx這樣的引擎api同樣天然。
tips:其實cc的api也是用了一個 creator.d.ts來達到表現和邏輯的統一。邏輯是在引擎代碼裏面實現的,而咱們看到的智能提示則是 creator.d.ts 這個文件,ctrl + 左鍵 也會跳轉到這裏。
根據上面的分析,若是你在 creator.d.ts 裏面加一個import或者export語句,你其餘文件就不能直接獲取不到cc的智能提示了,之前寫的cc.xx代碼會報錯,可是並不影響運行,由於cc的邏輯在引擎代碼裏面,讀者能夠本身嘗試。
像這種實現和聲明分離的作法通常用於第三方js插件什麼的,如protobufjs.js,引入工程後,邏輯有了,你直接調用裏面的api,雖然會提示代碼錯誤,可是邏輯並不會有問題,運行不報錯。這個時候就能夠經過寫對應的.d.ts文件來補足它的智能提示,達到表現和邏輯統一的效果。
對於咱們本身的工程文件,模塊文件來講,仍是推薦用上面的 GNum的寫法,實現邏輯和智能提示寫在一塊兒,既有充分的智能提示,又不須要寫額外的.d.ts,這纔是腳本語言的魅力(比java,c++簡潔,靈活)。
3.智能提示的寫法
jsdoc註釋(/** */)寫法的智能提示能夠被很好的展現,普通的註釋(//)則沒有這個功能,因此爲了獲取良好的智能提示效果,儘量的寫 jsdoc註釋(/** */)吧。jsdoc註釋的寫法讀者能夠自行百度,這裏就不展開說了。
本文分享自微信公衆號 - 一枚小工(caizj_cn)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。