【CSDN 編者按】Type 算是一種編程語言嗎?來看看你是否真的了解Type 和 JAVA 的區別以及它的使用場景。
原文鏈接:https://chrlschn.dev/blog/2023/09/type-is-not-a-programming-language/#understanding-type-vs-shape
作者 | Charles Chen
譯者|Ric Guan 責編 | 屠敏
出品 | CSDN(ID:CSDNnews)
最近,一個 Mastodon 帖子讓我陷入沉思,我在想為什么 Type 成為了一些開發人員難以采用的語言。
我的結論是,它從名字開始:“Type”,人們就誤解它只是靜態類型的 Java。
但實際上,它不是。
不將 Type 視為一種編程語言甚至類型系統可能更容易。事實上,了解 Type 的最簡單方法就是將其視為一種形狀定義語言。
了解類型與形狀
關于這一點的一個簡單示例是以下代碼片段:
在第 12 行,我們向函數描述了參數 req的形狀。
當我們運行這段代碼時,我們可以看到它的行為完全符合預期:
從第 12 行的函數定義可以看出,Type 并不是一個類型系統,它實際上是一個形狀定義系統(或者更正式地說,是一個結構類型系統)。
如果我們看一下 Java:
很明顯,這樣做是可行的。你可以看到,在輸出的 Java 中,Type 消失了。這是因為 Type 的唯一目的是告知編譯器和開發時語言服務器有關有效形狀的信息。事實上,Node 和瀏覽器都不運行 Type;他們只解析 Java。
Type 仍然是“鴨子類型”
當看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子。
上面代碼片段的一個變體可能有助于進一步強調這一點:
請注意第 12 行的微妙變化:我們將函數描述為需要一個形狀類似于 Req類型的參數 req,但該函數會很樂意接受接口 Req2的對象,因為 Type 不是類型系統。在 C# 等靜態類型語言中,盡管形狀匹配,但類型元數據不匹配,所以這將失敗(我們仍然可以在 C# 和 Java 等靜態類型語言中通過定義接口或抽象基類等類型契約來實現此目的) 。
考慮到這一點,許多其他實用類型和奇怪的“類型體操”就有意義了:它們都是描述形狀的簡單方式——通常是在其他現有形狀的背景下。
Type 實用函數
為了進一步強調這一點,請考慮以下使用實用程序類型 Omit<> 的示例:
或者,使用實用程序類型 Pick<> 進行逆操作:
每一種都只是描述有效形狀的不同方式。
Type 泛型
即使我們添加泛型類型約束(第 13 行),原理依舊是一樣的:
交叉類型
即使這個使用交集類型的構造也可以:
結語
如果你是一名正在使用 Type 的開發人員,那么你要做的第一件事可能就是忽略名稱中的 “Type” 部分,或許將其視為 “ShapeDef” ;你在開發時向語言服務器、編譯時向編譯器描述有效的形狀,以及為了您的開發團隊同事的理智。Type 不是靜態類型編程語言,而是具有形狀定義的 Java。
第二件事是拿起 Adam Freeman 的 Essential Type 書。這無疑是我擁有的最好的技術書籍之一,對于任何想要做好 Type 的開發人員來說都是一本很棒的書。
我希望從這些簡短的示例中可以清楚地看出,將 Type 視為一種編程語言或靜態類型系統,最終會給理解如何使用這種形狀定義系統編寫更安全的 Java 造成心理障礙。