在本系列文章的前一部分中,我們討論了安全可空性。
現在我們將解釋並解決 TypeScript 預設行為的第三個問題,也是最後一個問題:動態類型的剩餘部分。
我們將涵蓋:
- 動態類型的遺跡
- 實際平等檢查
- 條件中沒有隱式轉換
- 條件簡寫符號
- 字串和數字不能混合
動態類型的殘餘
TypeScript 應該是一個“靜態類型檢查器”,與 JavaScript 不同,JavaScript 中的類型是深度動態的。
但在本系列文章的前一部分中,我們也解釋了 TypeScript 是作為 JavaScript 的超集建構的。
所以問題是:JavaScript 動態型別系統的某些部分仍保留在 TypeScript 中。因此,我們將解釋如何抑制這些剩餘行為以實現完全靜態類型。
實際平等檢查
- ESLint:eqeqeq
- 生物群落:可疑.noDoubleEquals(推薦)
這個問題最好的例子就是相等性檢查。在 JavaScript 中,== 不完全是相等檢查,而是等價檢查:
1 == "1"; // true
儘管類型不同,但有些轉換規則會起作用,因此 JavaScript 能夠比較值。它可能會導致很多錯誤,因為規則細節很難記住,有時很奇怪,並且在所有動態語言(例如 PHP)中並不完全相同。
這些等價性檢查僅在 JavaScript 等動態類型語言中才有意義。從我們決定使用 TypeScript 的那一刻起,只應該使用實際的相等檢查(類型和值)。
1 === "1"; // false
eqeqeq lint 規則強制執行它。
來自 Java、C# 或 Rust 等語言的人應該特別小心這個問題,因為 JavaScript 或 TypeScript 中的 == 與這些語言中的含義不同。在 JavaScript 和 TypeScript 中,需要第三個 = 才能實現相同的行為。
條件中沒有隱式轉換
- ESLint:@typescript-eslint/strict-boolean-expressions
- 生物群系:缺少規則
認為現在情況安全嗎?不幸的是不是,因為轉換可以是隱式的:
let tax: number | undefined = 0; if (tax) { console.log("Process payment"); } if (!tax) { throw new Error(); }
上面的例子相當於:
let tax: number | undefined = 0; if (tax == true) { console.log("Process payment"); } if (tax == false) { throw new Error(); }
如您所見,存在隱式 ==,因此仍然會發生轉換:0 不等於 true,它相當於 false。因此,儘管稅費是有效值,它也會出錯。
嚴格布林表達式 lint 規則不允許此類隱式條件,並強制執行實際檢查:
let tax: number | undefined = 0; if (tax !== undefined) { console.log("Process payment"); } if (tax === undefined) { throw new Error(); }
對於習慣了 JavaScript 快速條件的人來說,這可能是最繁瑣的規則之一,但從長遠來看,這只是在 Java、C# 或 Rust 等其他語言中執行操作的正常方法。
如組態部分所示,停用allowNumber 和allowString 子選項對於避免所有錯誤非常重要。
唯一允許的例外是物件和陣列:這些情況是安全的,因為與字串和數字相反,它們沒有假值。所以下面的還是可以的:
let movie: Movie | undefined; if (movie) {} if (!movie) {}
注意:switch 語句已經安全,因為它們在內部使用 ===。
條件簡寫
- ESLint:@typescript-eslint/prefer-nullish-coalescing(在風格類型檢查中)
- 生物群系:缺少規則
嚴格布林表達式 lint 規則注意條件檢查是型別安全的,但除了 if 之外還有其他條件語法:
const movieRating = userRating || 5; // Which is a shorter version of: const movieRating = userRating == true ? userRating : 5;
如果使用者評分為 0,則 0 相當於 false,因此評分將為 5 而不是 0。
使用現代 JavaScript 可以避免這種情況:
const movieRating = userRating ?? 5; // Which is a shorter version of: const movieRating = userRating !== undefined && userRating !== null ? userRating : 5;
它可以透過prefer-nullish-coalescing lint規則強制執行。
請注意? ?不應在任何地方使用: ||在使用布林值時仍然相關。
字串和數字不能混合
- ESLint:
- 首選模板
- @typescript-eslint/restrict-plus-operands(在建議類型檢查中)
- @typescript-eslint/restrict-template-expressions(在建議類型檢查中)
- 生物群落:
- style.useTemplate(建議)
- 缺少其他規則
在 JavaScript 中,+ 運算子既可用於數字的數學加法,也可用於字串連接。它會導致錯誤。
"There is " + 3 + 1 + "Matrix movies"; // 31 "There is " + (3 + 1) + "Matrix movies"; // 4
+ 運算子應該保留用於數學加法。或者至少,它應該僅用於相同類型的數據,這是限制加操作數 lint 規則強制執行的。
Template strings from modern JavaScript should be used for string concatenation, which the prefer-template lint rule enforces:
const movie = `Everything everywhere all at once`; `${movie} is the best movie!`;
Conversely, only strings should be used in template strings, which the restrict-template-expressions lint rule enforces.
If mixing types is what is actually wanted, conversions should be explicit:
const total = 3; `There is ${total.toFixed()} Matrix movies`;
Note that template strings can be nested:
const total = 3; `There is ${total.toFixed()} Matrix movie${total > 1 ? "s" : ""}`;
Conclusion
This is the end of this posts series. You can follow my account (button on top right of this page) to know when other posts about TypeScript or other topics like Angular are published.
You want to contact me? Instructions are available in the summary.
以上是TypeScript 嚴格類型 - 部分完整靜態類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

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

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

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

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

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

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