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