」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > TypeScript 嚴格類型 - 部分完整靜態類型

TypeScript 嚴格類型 - 部分完整靜態類型

發佈於2024-08-06
瀏覽:391

TypeScript strictly typed - Part full static types

在本系列文章的前一部分中,我们讨论了安全可为空性。

现在我们将解释并解决 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

运算符应保留用于数学加法。或者至少,它应该仅用于相同类型的数据,这是restrict-plus-operands lint 规则强制执行的。

现代 JavaScript 中的模板字符串应该用于字符串连接,prefer-template lint 规则强制执行:

const movie = `Everything everywhere all at once`;
`${movie} is the best movie!`;

相反,模板字符串中只能使用字符串,这是restrict-template-expressions lint 规则强制执行的。

如果混合类型是实际想要的,则转换应该是显式的:

const total = 3;
`There is ${total.toFixed()} Matrix movies`;

注意模板字符串可以嵌套:

const total = 3;
`There is ${total.toFixed()} Matrix movie${total > 1 ? "s" : ""}`;

结论

这是本系列文章的结尾。您可以关注我的帐户(本页右上角的按钮),了解有关 TypeScript 或 Angular 等其他主题的其他帖子何时发布。

您想联系我?摘要中提供了说明。

版本聲明 本文轉載於:https://dev.to/cyrilletuzi/typescript-strictly-typed-part-4-full-static-types-8bc?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-05-17
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-05-17
  • 為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    在CSS 問題:不正確的代碼: 全球範圍將所有餘量重置為零,如提供的代碼所建議的,可能會導致意外的副作用。解決特定的保證金問題是更建議的。 例如,在提供的示例中,將以下代碼添加到CSS中,將解決餘量問題: body H1 { 保證金頂:-40px; } 此方法更精確,避免了由全局保證金重置...
    程式設計 發佈於2025-05-17
  • Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    程式設計 發佈於2025-05-17
  • 如何避免Go語言切片時的內存洩漏?
    如何避免Go語言切片時的內存洩漏?
    ,a [j:] ...雖然通常有效,但如果使用指針,可能會導致內存洩漏。這是因為原始的備份陣列保持完整,這意味著新切片外部指針引用的任何對象仍然可能佔據內存。 copy(a [i:] 對於k,n:= len(a)-j i,len(a); k
    程式設計 發佈於2025-05-17
  • 如何從Google API中檢索最新的jQuery庫?
    如何從Google API中檢索最新的jQuery庫?
    從Google APIS 問題中提供的jQuery URL是版本1.2.6。對於檢索最新版本,以前有一種使用特定版本編號的替代方法,它是使用以下語法:獲取最新版本:未壓縮)While these legacy URLs still remain in use, it is recommended ...
    程式設計 發佈於2025-05-17
  • Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    在ASP.NET async void void async void void void void void的設計無需返回asynchroncon而無需返回任務對象。他們在執行過程中增加未償還操作的計數,並在完成後減少。在某些情況下,這種行為可能是有益的,例如未期望或明確預期操作結果的火災和...
    程式設計 發佈於2025-05-17
  • 解決MySQL插入Emoji時出現的\\"字符串值錯誤\\"異常
    解決MySQL插入Emoji時出現的\\"字符串值錯誤\\"異常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    程式設計 發佈於2025-05-17
  • 哪種在JavaScript中聲明多個變量的方法更可維護?
    哪種在JavaScript中聲明多個變量的方法更可維護?
    在JavaScript中聲明多個變量:探索兩個方法在JavaScript中,開發人員經常遇到需要聲明多個變量的需要。對此的兩種常見方法是:在單獨的行上聲明每個變量: 當涉及性能時,這兩種方法本質上都是等效的。但是,可維護性可能會有所不同。 第一個方法被認為更易於維護。每個聲明都是其自己的語句,使...
    程式設計 發佈於2025-05-17
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-05-17
  • Go語言如何動態發現導出包類型?
    Go語言如何動態發現導出包類型?
    與反射軟件包中的有限類型的發現能力相反,本文探索了替代方法,探索了在Runruntime。 go import( “ FMT” “去/進口商” ) func main(){ pkg,err:= incorter.default()。導入(“ time”) 如果er...
    程式設計 發佈於2025-05-17
  • 如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    程式設計 發佈於2025-05-17
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-05-17
  • PHP與C++函數重載處理的區別
    PHP與C++函數重載處理的區別
    作為經驗豐富的C開發人員脫離謎題,您可能會遇到功能超載的概念。這個概念雖然在C中普遍,但在PHP中構成了獨特的挑戰。讓我們深入研究PHP功能過載的複雜性,並探索其提供的可能性。 在PHP中理解php的方法在PHP中,函數超載的概念(如C等語言)不存在。函數簽名僅由其名稱定義,而與他們的參數列表無關...
    程式設計 發佈於2025-05-17
  • 如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    使用http request 上傳文件上傳到http server,同時也提交其他參數,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    程式設計 發佈於2025-05-17

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3