✨ TypeScript 中的廣告創意
我愛❤️ TypeScript。
特別是在經歷了 JavaScript 臭名昭著的「無法存取未定義的值」錯誤之後。
然而,即使 TypeScript 很棒,仍然有搬石頭砸自己腳的方法。
在這篇文章中,我將分享 TypeScript 中的 5 個不良做法以及如何避免它們。
?下載我的免費 101 React Tips And Tricks Book,搶佔先機。
1. 將錯誤宣告為 Any 類型
例子
在下面的程式碼片段中,我們捕獲錯誤然後將其聲明為類型any。
async function asyncFunction() { try { const response = await doSomething(); return response; } catch (err: any) { toast(`Failed to do something: ${err.message}`); } }
為什麼不好❌
不保證錯誤具有字串類型的訊息欄位。
不幸的是,由於類型斷言,程式碼讓我們假設它確實如此。
程式碼可以在開發中使用特定的測試案例,但在生產中可能會嚴重損壞。
怎麼辦呢✅
不要設定錯誤類型。預設應該是未知的。
相反,您可以執行以下任一操作:
- 選項 1: 使用類型保護檢查錯誤的類型是否正確。
async function asyncFunction() { try { const response = await doSomething(); return response; } catch (err) { const toastMessage = hasMessage(err) ? `Failed to do something: ${err.message}` : `Failed to do something`; toast(toastMessage); } } // We use a type guard to check first function hasMessage(value: unknown): value is { message: string } { return ( value != null && typeof value === "object" && "message" in value && typeof value.message === "string" ); } // You can also simply check if the error is an instance of Error const toastMessage = err instanceof Error ? `Failed to do something: ${err.message}` : `Failed to do something`;
- 選項 2(建議): 不要對錯誤做出假設
不要對錯誤類型做出假設,而是明確處理每種類型並向使用者提供適當的回饋。
如果無法確定特定的錯誤類型,最好顯示完整的錯誤訊息而不是部分詳細資訊。
有關錯誤處理的更多信息,請查看這個優秀的指南:編寫更好的錯誤訊息。
2. 具有多個相同類型的連續參數的函數
例子
export function greet( firstName: string, lastName: string, city: string, email: string ) { // Do something... }
為什麼不好❌
- 您可能會意外地以錯誤的順序傳遞參數:
// We inverted firstName and lastName, but TypeScript won't catch this greet("Curry", "Stephen", "LA", "stephen.curry@gmail.com")
- 很難理解每個參數代表什麼,尤其是在程式碼審查期間,當在聲明之前看到函數呼叫時
該怎麼辦 ✅
使用物件參數來闡明每個欄位的用途並最大程度地減少錯誤風險。
export function greet(params: { firstName: string; lastName: string; city: string; email: string; }) { // Do something... }
3. 具有多個分支且無返回類型的函數
例子
async function asyncFunction() { try { const response = await doSomething(); return response; } catch (err: any) { toast(`Failed to do something: ${err.message}`); } }
為什麼不好❌
新增新的 AnimalType 可能會導致傳回結構錯誤的物件。
傳回型別結構的變更可能會導致程式碼其他部分出現難以追蹤的問題。
拼字錯誤可能會導致推論出不正確的類型。
該怎麼辦 ✅
明確指定函數的回傳類型:
async function asyncFunction() { try { const response = await doSomething(); return response; } catch (err) { const toastMessage = hasMessage(err) ? `Failed to do something: ${err.message}` : `Failed to do something`; toast(toastMessage); } } // We use a type guard to check first function hasMessage(value: unknown): value is { message: string } { return ( value != null && typeof value === "object" && "message" in value && typeof value.message === "string" ); } // You can also simply check if the error is an instance of Error const toastMessage = err instanceof Error ? `Failed to do something: ${err.message}` : `Failed to do something`;
4. 新增不必要的類型而不是使用可選字段
例子
export function greet( firstName: string, lastName: string, city: string, email: string ) { // Do something... }
為什麼不好❌
無法擴充:新增欄位需要建立多個新類型
使類型檢查更加複雜,需要額外的類型保護
導致型別名稱混亂且維護更加困難
該怎麼辦 ✅
使用選用欄位來保持類型簡單且易於維護:
// We inverted firstName and lastName, but TypeScript won't catch this greet("Curry", "Stephen", "LA", "stephen.curry@gmail.com")
5. 在不同的元件層級使屬性可選
例子
disabled 屬性在所有元件中都是可選的。
export function greet(params: { firstName: string; lastName: string; city: string; email: string; }) { // Do something... }
為什麼不好❌
- 很容易忘記傳遞停用的屬性,導致部分啟用的表單
該怎麼辦 ✅
將共用欄位設為必填對於內部元件。
這將確保正確的道具傳遞。這對於較低級別的組件儘早發現任何疏忽尤其重要。
在上面的範例中,所有內部元件現在都需要停用。
function getAnimalDetails(animalType: "dog" | "cat" | "cow") { switch (animalType) { case "dog": return { name: "Dog", sound: "Woof" }; case "cat": return { name: "Cat", sound: "Meow" }; case "cow": return { name: "Cow", sound: "Moo" }; default: // This ensures TypeScript catches unhandled cases ((_: never) => {})(animalType); } }
注意:如果您正在為庫設計元件,我不建議這樣做,因為必填欄位需要更多工作。
概括
TypeScript 很棒,但沒有工具 ?️ 是完美的。
避免這 5 個錯誤將幫助您編寫更乾淨、更安全、更易於維護的程式碼。
更多提示,請查看我的免費電子書,101 React Tips & Tricks。
?發現錯誤
?本週提示
這是一個包裝? .
<script> // Detect dark theme var iframe = document.getElementById('tweet-1869351983934738523-882'); if (document.body.className.includes('dark-theme')) { iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1869351983934738523&theme=dark" } </script>發表評論?分享您所犯的 Typescript 錯誤。 <script> // Detect dark theme var iframe = document.getElementById('tweet-1869050042931449902-927'); if (document.body.className.includes('dark-theme')) { iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1869050042931449902&theme=dark" } </script>別忘了加上「???」。
如果您正在學習 React,請免費下載我的 101 React Tips & Tricks 書。
如果您喜歡這樣的文章,請加入我的免費時事通訊,FrontendJoy。
如果您想要每日提示,請在 X/Twitter 或 Bluesky 上找到我。
以上是✨ TypeScript 中的廣告創意的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。
