本文最初發表于 Towards Data Science 博客,經原作者 Rhea Moutafis 授權,InfoQ 中文站翻譯并分享。
Python 是我的謀生工具,我很喜歡它。盡管我對這門語言有一些批評的地方,但我還是強烈推薦給任何開始從事數據科學的人。反正在這個領域中,比較有經驗的人往往都是 Python 的布道師。
然而,這并不意味著你不能時不時地挑戰你所在領域的極限,例如探索不同的編程范式或新的編程語言。
Python 的競爭對手名單很長: Rust 、 Go 、 Scala 、Haskell、 Julia 、Swift、C++、JAVA 和 R 都可以在其中找到條目。在如此擁擠的領域里,JavaScript 和 TypeScript 沒有得到那么多的認可,這是可以理解的。
但這并不意味著 TypeScript 不是通用編程領域的主流。然而,在數據科學家群體中,它似乎從來就沒有特別受歡迎過。
你可能會得出這樣的結論,TypeScript 可能不是數據科學的理想選擇。但不要急著下結論。盡管它可能不適合數據科學的每一部分,但在某些領域上,它比 Python 有明顯的優勢。
如果你碰巧在這些領域之一工作的話,那么值得給 TypeScript 一個機會。如果你不這么做的話,誰知道你的下一步會在哪里呢?這個領域發展得如此之快。如果你能將眼光放遠一些,你就有了競爭優勢。
TypeScript:是一種 JavaScript,但類型安全
大約十年前,Microsoft 的軟件工程師注意到,JavaScript 已經不能滿足他們所有的需求了。一方面,該語言發展迅速,并增加了非常有趣的新特性。另一方面,管道中的任何功能都不能解決一個根本性的問題:JavaScript 對于小型程序來說非常棒,但用它來編寫整個應用程序卻一團糟。
解決這一問題有幾種可能性:例如,可以使用不同的編程語言,或者使用更好的語法重新設計 JavaScript。Microsoft 的開發團隊采取了一種不同的方法:他們通過擴展 JavaScript 創建了 TypeScript。通過這種方式,他們能夠利用 JavaScript 的所有新特性,同時擺脫了那些不適合大型項目的東西。
與 Python 類似,JavaScript 是在運行時編譯的,這意味著你需要運行代碼來調試它。另一方面,TypeScript 是編譯的。這提供了額外的安全層,因為程序員在執行時間之前就可以獲得關于可能存在的 Bug 信息。對于 Python 或 JavaScript 這樣的非編譯語言,一旦意識到代碼的行為與預期不符,定位 Bug 可能會非常耗時。
然而,JavaScript 和 TypeScript 之間的關鍵區別在于類型檢查器。在編譯時,每個 TypeScript 程序都會檢查數據類型是否彼此一致。
手動做這些事可能聽起來微不足道。但是,當你在項目中使用數千行代碼時,你就會感謝上帝賜予你這一切。
還有一些其他不同之處,例如,TypeScript 有匿名函數和異步函數。匿名函數是函數式編程的一個關鍵特性,它可以使程序在大數據負載下更加高效。
當你需要并行執行多個操作時,或者在處理不應中斷后臺進程的 I/O 操作時,異步編程非常有用。異步編程在 Python 和 JavaScript 中是可能實現的,但在 TypeScript 中,異步編程是內置在內核中的。

TypeScript 是 JavaScript 的超集
TypeScript 是如何流行起來的
如果你討厭 JavaScript 中不斷發生的不合邏輯但又滑稽可笑的、令人抓狂的時刻,那么,我有一個壞消息告訴你:你在 TypeScript 中也會看到所有這些東西。
但是,這些語法上的小問題,并不是程序員如此熱愛 TypeScript 的原因。更確切地說,這可以歸結為這樣一個想法:你需要一個很棒的產品(JavaScript),并添加更棒的東西(靜態類型)。
當然,我并不是說 JavaScript 總是很棒,或者靜態類型總是最好的處理方式。但是,對于構建大型 Microsoft 風格的應用程序來說,這似乎非常好用。
話雖如此,TypeScript 仍然只擁有 JavaScript 的一小部分人氣。這可以歸結為發行時間的原因:TypeScript 發行有八年了,而 JavaScript 的發行時間是它的三倍!Python 在這一領域中,也是一款有著三十年發行歷史的老古董。
盡管它很年輕,但在某些領域中,TypeScript 是不可避免的。這就增加了它的受歡迎程度。例如,當 google 在 2016 年宣布 Angular.js 將與 TypeScript 一起使用時,TypeScript 在 StackOverflow 上的標簽數量呈爆炸式激增。

與 Python 和 JavaScript 的吸引力相比,TypeScript 只占一小部分。不過,在某些領域,TypeScript 是不可避免的。
TypeScript 在什么地方比 Python 更有優勢
JavaScript 之所以在當時很受歡迎,是因為它可以在任何地方運行。你可以在服務器、瀏覽器或你喜歡的任何地方來運行它。你只需編譯一次,它就可以在任何地方工作。當它第一次出現時,簡直就像是魔法一樣。
由于它是基于 JavaScript 構建的,所以 TypeScript 也繼承了這種魔法。Python 也是如此!當然,Python 的實現方式略有不同,因為它使用的是解釋器而不是虛擬機。但這并不能改變這樣一個事實:就一次編寫到處運行這方面,TypeScript 和 Python 是可以相提并論的。
像泛型和靜態類型這樣的特性使得在 TypeScript 中進行函數式編程比在 Python 中更容易。這可能是一個優勢。因為由于數據科學、并行編程、異步編程等領域的發展,對函數式代碼的需求正在增長。
另一方面,Python 也在添加越來越多的函數式編程特性。當涉及到數據科學、機器學習等方面,Python 處于前沿地位。
這就剩下并行編程和異步編程了。盡管這兩種編程語言都可以完成這兩種工作,但是有一個很大的不同:在 Python 中,你需要使用特定的庫來完成任務。而在 TypeScript 中,所有的庫都是與內核異步的。由于后者在默認情況下功能更多,因此進行并行編程更容易一些。
換句話說,如果你是從事異步進程和并行計算的 Python 開發人員,那么你可能會想嘗試一下 TypeScript。
TypeScript 適合數據科學嗎?
許多數據科學家都在處理異步和并行進程。你可能已經在考慮使用 TypeScript 而不是 Python 來編寫下一個項目。不過,這究竟是不是一個好主意,還要取決于許多其他因素。
首先,TypeScript 并沒有一種簡單明了的方式進行列表推導。例如,當處理大型數據時,這可能會令人感到沮喪。
其次,TypeScript 中并沒有原生矩陣運算。Python 中有 NumPy,以及許多其他工具,這些工具使 Python 變得更容易。因此,如果你的項目有大量的線性代數,你可能不會想用 TypeScript。
再次,如果你對 JavaScript 不是很熟悉的話,你幾乎肯定會有一些困惑。因為 TypeScript 就是基于 JavaScript 構建的,前者繼承了后者的所有特性——所有好的、壞的和令人抓狂的特性。不過,說實話,遇到這些現象也會很有趣……
最后,你還需要考慮到編程并不是一種單獨的職業。在數據科學領域中,有一個龐大的 Python 社區,它能為你提供支持和建議。但在目前,TypeScript 在數據科學家中并沒有那么流行。因此,你可能無法在 StackOverflow 和其他地方找到對你的問題有幫助的答案。
也就是說,如果你要開始一個沒有太多大數據和矩陣運算的小項目,那么無論如何你都可以嘗試一下 TypeScript。特別是當它涉及到并行或異步編程時。
底線:清楚在何處使用你的工具
并不是每項任務都有一種語言。當然,有些語言比其他語言更為有趣,或更為直觀。當然,熱愛你的工具是很重要的,因為這會讓你在困難的時候繼續前進。因此,從一種很受歡迎的編程語言(如 TypeScript 或 Python)開始,并不是一個壞主意。
但歸根結底,你不應該像信奉宗教信仰一樣只信奉一種編程語言。編程語言只不過是一種工具。至于哪種工具最適合你,主要取決于你想用它做什么。
目前,對數據科學領域來說,Python 是巨大的存在。但是,在一個快速發展的領域,你需要把眼光放遠一些。隨著任務的改變,你的工具也會隨之改變。
另一方面,TypeScript 有一個圍繞前端 Web、后端節點和移動開發的活躍社區。有趣的是,這些領域與數據科學的交叉比人們想象的要高。特別是,Node 在數據科學家中越來越受到關注。
當然,這并不意味著你應該一次涉足十幾種編程語言。真正精通一門編程語言有著巨大的價值。但從長遠來看,對其他語言和技術的好奇心將有助于你保持領先地位。
所以,當你想嘗試新事物的時候,不要猶豫!那為什么還不去嘗試 TypeScript 呢?
作者介紹:
Rhea Moutafis,正在攻讀暗物質物理學博士學位。熱愛藝術、音樂及美好事物。
原文鏈接:
https://towardsdatascience.com/why-developers-love-typescript-every-bit-as-much-as-python-687d075cfb5e