我愛❤️ 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中文網其他相關文章!

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

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