新聞組和郵件列表里、在計算機科學(xué)實驗室里、在各大陸之間,流傳著一個神秘的故事,那是關(guān)于 Perl 與動態(tài)網(wǎng)站之間的不得不說的往事。 -- Michael Stevenson
本文導(dǎo)航
-CGI 腳本和信息軟件 …… 11%
-題外話 …… 26%
-回到 Perl HTTPD …… 54%
-歷史展望 …… 87%
編譯自: https://opensource.com/life/16/11/perl-and-birth-dynamic-web作者: Michael Stevenson
譯者: wcnnbdk1
在新聞組和郵件列表里、在計算機科學(xué)實驗室里、在各大陸之間,流傳著一個神秘的故事,那是關(guān)于 Perl 與動態(tài)網(wǎng)站之間的不得不說的往事。
早期互聯(lián)網(wǎng)歷史中,有一些膾炙人口的開創(chuàng)性事件:如蒂姆·伯納斯·李Tim Berners-Lee在郵件組上宣布[1] WWW-project 的那天,該文檔隨同 CERN[2] 發(fā)布的項目代碼進入到了公共域,以及 1993 年 1 月的第一版 NCSA Mosaic 瀏覽器[3]。雖然這些獨立的事件是相當重要的,但是當時的技術(shù)的開發(fā)已經(jīng)更為豐富,不再是由一組的孤立事件組成,而更像是一系列有內(nèi)在聯(lián)系的故事。
這其中的一個故事描述的是網(wǎng)站是如何變成動態(tài)的,通俗說來就是我們?nèi)绾问狗?wù)器除了提供靜態(tài) HTML 文檔之外做更多的事。這是個流傳在新聞組[4]和郵件列表間、計算機科學(xué)實驗室里、各個大陸之間的故事,重點不是一個人,而是一種編程語言:Perl。
在上世紀 90 年代中后期,Perl 幾乎和動態(tài)網(wǎng)站是同義詞。Perl 是一種相對來說容易學(xué)習(xí)的解釋型語言,并且有強大的文本處理特性,使得它能夠很容易的編寫腳本來把一個網(wǎng)站關(guān)聯(lián)到數(shù)據(jù)庫、處理由用戶發(fā)送的表單數(shù)據(jù),當然,還要創(chuàng)造那些上世紀 90 年代的網(wǎng)站的經(jīng)典形象——計數(shù)器和留言簿。
類似的網(wǎng)站特性漸漸的變成了 CGI 腳本的形式,其全稱為通用網(wǎng)關(guān)接口Common Gateway Interface,首個實現(xiàn)[5]由 Rob McCool 于 1993 年 11 月在 NCSA HTTPD 上完成。CGI 是目的是直面功能,并且在短短幾年間,任何人都可以很容易的找到一些由 Perl 寫的預(yù)制的腳本存檔。有一個聲名狼籍的案例就是 Matt's Scripts Archive[6],這是一種流行卻包含各種安全缺陷的源代碼庫,它甚至使得 Perl 社區(qū)成員創(chuàng)建了一種被稱為 Not Matt‘s Scripts[7] 的更為專業(yè)的替換選擇。
在當時,無論是業(yè)余愛好者,還是職業(yè)程序員都采用 Perl 來制作動態(tài)網(wǎng)站和應(yīng)用,Tim O’Reilly 創(chuàng)造了詞匯“信息軟件”infoware[8]來描述網(wǎng)站和 Perl 怎樣成為變化中的計算機工業(yè)的一部分。考慮到 Yahoo!和 Amazon 帶來的創(chuàng)新,O‘Reilly 寫道:“傳統(tǒng)軟件在大量的軟件中僅僅包含了少量的信息;而信息軟件則在少量的軟件中包含了大量的信息。” Perl 是一種像瑞士軍刀一樣的完美的小而強大的工具,它支撐了信息媒體從巨大的網(wǎng)站目錄向早期的用戶生成內(nèi)容(UGC)平臺的轉(zhuǎn)變。
盡管使用 Perl 來制作 CGI 簡直是上佳之選,但是編程語言和不斷提升中的動態(tài)網(wǎng)站之間的關(guān)系變得更加的密切與深入。從第一個網(wǎng)站[9](在 1990 年的圣誕節(jié)前)出現(xiàn)到 1993 年 McCool 實現(xiàn) CGI 的短暫時期內(nèi),Web 上的各種東西,比如表單、圖片以及表格,就這么逐漸出現(xiàn)在上世紀 90 年代乃至后來。盡管伯納斯·李也對這些早期的歲月產(chǎn)生了影響,但是不同的人看到的是 Web 不同的潛在作用,并將它推向各自不同的方向。一方面,這樣的結(jié)果來自一些著名的辯論,例如 HTML 應(yīng)該和 SGML 保持多近的關(guān)系[10]、是否應(yīng)該實現(xiàn)一個圖像標簽[11]等等。在另一方面,在沒有直接因素影響的情況下改變是極其緩慢的。后者已經(jīng)很好的描述了動態(tài)網(wǎng)站是如何發(fā)展的。
從某種意義上說,第一個“網(wǎng)關(guān)”的誕生可以追溯到 1991 至 1992 年之間(LCTT 譯注:此處所謂“網(wǎng)關(guān)”的意義請參照 CGI 的定義),當時伯納斯·李和一些計算機科學(xué)家與超文本愛好者編寫服務(wù)程序[12]使得一些特定的資源能夠連接到一起,例如 CERN 的內(nèi)部應(yīng)用程序、通用的應(yīng)用程序如 Oracle 數(shù)據(jù)庫、廣域信息查詢系統(tǒng)(WAIS)[13] 等等。(WAIS 是 Web 的前身,上世紀 80 年代后期開發(fā),其中,開發(fā)者之一 Brewster Kahle[14],是一個數(shù)字化圖書管理員和 Internet Archive[15] 的創(chuàng)始人。)可以這樣理解,“網(wǎng)關(guān)”就是一個被設(shè)計用來連接其它 Web、數(shù)據(jù)庫或者應(yīng)用程序的定制的 Web 服務(wù)器。任何的動態(tài)功能就意味著在不同的端口上運行另外一個守護進程(參考閱讀,例如伯納斯·李對于在網(wǎng)站上如何添加一個搜索功能[16] 的描述)。伯納斯·李期望 Web 可以成為不同信息系統(tǒng)之間的通用接口,并且鼓勵建立單一用途服務(wù)。他也提到 Perl 是一種強大的(甚至是不可思議)、可以將各種東西組合起來的語言。
然而,另一種對“網(wǎng)關(guān)”的理解指出它不一定是一個定制設(shè)備,可能只是一個腳本,一個并不需要額外服務(wù)器的低吞吐量的附加腳本。這種形式的首次出現(xiàn)是有爭議性的 Jim Davis 的 Gateway to the U Mich Geography server[17],于 1992 年的 11 月發(fā)布在了 WWW-talk 郵件列表中。Davis 的腳本是使用 Perl 編寫的,是一種 Web API 的原型,基于格式化的用戶查詢從另外的服務(wù)器拉取數(shù)據(jù)。我們來說明一下這兩種對于網(wǎng)關(guān)的理解的不同之處,伯納斯·李回復(fù)了[18] Davis 的郵件,期望他和 Michigan 服務(wù)器的作者“能夠達成某種共識”,“從網(wǎng)絡(luò)的角度來看的話”僅使用一臺服務(wù)器來提供這樣的信息可能會更有意義。伯納斯·李,可能是期待著 Web 的發(fā)明者可以提出一種有秩序的信息資源訪問方式。這樣從不同服務(wù)器上拉取數(shù)據(jù)的網(wǎng)關(guān)和腳本意味著一種潛在的 Web 的質(zhì)的變化,雖然不斷增多,但也可能有點偏離了伯納斯·李的原始觀點。
在 Davis 的地理服務(wù)器上的網(wǎng)關(guān)向標準化的、低吞吐量的、通過 CGI 方式實現(xiàn)的腳本化網(wǎng)關(guān)邁進的一步中,Perl HTTPD[19] 的出現(xiàn)是很重要的事件,它是 1993 年初由印地安納大學(xué)的研究生 Marc Van Heyningen 在布盧明頓Bloomington完全使用 Perl 語言實現(xiàn)的一個 Web 服務(wù)器程序。從 Van Heyningen 給出的設(shè)計原則[20]來看,基于使用 Perl 就不需要任何的編譯過程這樣一種事實,使得它能夠成為一種極易擴展的服務(wù)器程序,這個服務(wù)器包含了“一個向代碼中增加新特性時只要簡單的重啟一下就可以,而不會有任何的宕機時間的特性”,使得這個服務(wù)器程序可以頻繁的加入新功能。
Perl HTTPD 代表了那種服務(wù)器程序應(yīng)該是單一、特定目的的觀點。相應(yīng)的,這種模式似乎暗示了在 Web 開發(fā)中像這樣漸進式的、持續(xù)測試的軟件產(chǎn)品可能會最終變成一種共識。Van Heyningen 在后來提到過[21]他從頭編寫這樣一個服務(wù)器程序的初衷是當時沒有一種簡便的方式使用 CERN 服務(wù)器程序來生成“虛擬文檔”(例如,動態(tài)生成的頁面),他打趣說使用 Perl 這樣的“神之語言”來寫可能是最簡單的方式了。在他初期編寫的眾多腳本中有一個 Sun 操作系統(tǒng)的用戶手冊的 Web 界面,以及 Finger 網(wǎng)關(guān)[22](這是一種早期用來共享計算機系統(tǒng)信息或者是用戶信息的協(xié)議)。
雖然 Van Heyningen 將印地安納大學(xué)的服務(wù)器主要用來連接現(xiàn)存的信息資源,他和研究生們同時也看見了作為個人發(fā)布形式的潛在可能。其中一件廣為人知事件是在 1993-1994 年之間圍繞著一個著名的加拿大案件而公布[23]的一系列的文件、照片和新聞故事,與此形成鮮明對比的是,所有的全國性媒體都保持了沉默。
Perl HTTPD 沒有堅持到現(xiàn)在的需要。今天,Van Heyningen 回憶起這個程序的時候認為這個程序只是當時的一個原型產(chǎn)品。它的原始目的只是向那些已經(jīng)選擇了 Gopher 作為大學(xué)的網(wǎng)絡(luò)界面的資深教員們展示了網(wǎng)絡(luò)的另一種利用方式。Van Heyningen 以一種基于 Web 的、可搜索的出版物索引[24]的方式,用代碼回應(yīng)了他的導(dǎo)師們的虛榮。就是說,在服務(wù)器程序技術(shù)方面關(guān)鍵創(chuàng)新是為了贏得爭論的勝利而誕生的,在這個角度上來看代碼做到了所有要求它所做的事。
不管該服務(wù)器程序的生命是否短暫,伴隨者 Perl HTTPD 一起出現(xiàn)的理念已經(jīng)傳播到了各個角落。Van Heyningen 開始收到了獲取該代碼的請求,而后將它分享到了網(wǎng)上,并提示說,需要了解一些 Perl 就可以將它移植到其它操作系統(tǒng)(或者找到一個這樣的人也行)。不久之后,居住在奧斯汀Austin的程序員 Tony Sanders 開發(fā)了一個被稱為 Plexus[25] 的輕便版本。Sander 的服務(wù)器程序是一款全功能的產(chǎn)品,并且同樣包含了 Perl HTTPD 所建議的易擴展性,而且添加一些新的特性如圖片解碼等。Plexus 直接影響了[26] Rob McCool 給 NCSA HTTPD 服務(wù)器上的腳本開發(fā)的“htbin”,并且同樣影響到了不久之后誕生的通用網(wǎng)關(guān)接口(CGI)。
在這些歷史遺產(chǎn)之外,感謝妙不可言的互聯(lián)網(wǎng)時光機Internet Archive使得 Perl HTTPD 在今天依然保留在一種我們依然可以獲取的形式,你可以從這里下載 tarball[27]。
對于技術(shù)世界的顛覆來說,技術(shù)的改變總是在一個相互對立的過程中。現(xiàn)有的技術(shù)是思考新技術(shù)的基礎(chǔ)與起點。過時的編程形式啟迪了今天人們做事的新方式。網(wǎng)絡(luò)世界的創(chuàng)新可能看起來更像是對于舊技術(shù)的擴展,不僅僅是 Perl。
在萌芽事件的簡單的時間軸之外,Web 歷史學(xué)者也許可以從 Perl 獲取更多的線索。其中一部份的挑戰(zhàn)在于材料的獲取。更多需要做的事情包括從可獲取的大量雜亂的數(shù)據(jù)中梳理出它的結(jié)構(gòu),將分散在郵件列表、歸檔網(wǎng)站,書本和雜志中的信息內(nèi)容組合在一起。還有一部分的挑戰(zhàn)是需要認識到 Web 的歷史不僅僅是新技術(shù)發(fā)布的日子,它同時包括了個人記憶、人類情感與社會進程等,并且這不僅僅是單一的歷史線而是有許許多多條相似的歷史線組合而成的。就如 Perl 的信條一樣“殊途同歸。There's More Than One Way To Do It.”
(題圖來自:pinterest.com[28])
via: https://opensource.com/life/16/11/perl-and-birth-dynamic-web
作者:Michael Stevenson[29] 譯者:wcnnbdk1 校對:wxy
本文由 LCTT[30] 原創(chuàng)編譯,Linux中國 榮譽推出
[1]: 宣布 - https://groups.google.com/forum/#!msg/alt.hypertext/eCTkkOoWTAY/bJGhZyooXzkJ
[2]: CERN - https://tenyears-www.web.cern.ch/tenyears-www/
[3]: 第一版 NCSA Mosaic 瀏覽器 - http://1997.webhistory.org/www.lists/www-talk.1993q1/0099.html
[4]: 新聞組 - https://en.wikipedia.org/wiki/Usenet_newsgroup
[5]: 首個實現(xiàn) - http://1997.webhistory.org/www.lists/www-talk.1993q4/0518.html
[6]: Matt's Scripts Archive - https://web.archive.org/web/19980709151514/http://scriptarchive.com/
[7]: Not Matt‘s Scripts - http://nms-cgi.sourceforge.net/
[8]: “信息軟件” - https://web.archive.org/web/20000815230603/http://www.edventure.com/release1/1198.html
[9]: 第一個網(wǎng)站 - http://info.cern.ch/hypertext/WWW/TheProject.html
[10]: HTML 應(yīng)該和 SGML 保持多近的關(guān)系 - http://1997.webhistory.org/www.lists/www-talk.1993q1/0096.html
[11]: 是否應(yīng)該實現(xiàn)一個圖像標簽 - http://1997.webhistory.org/www.lists/www-talk.1993q1/0182.html
[12]: 編寫服務(wù)程序 - http://info.cern.ch/hypertext/WWW/Daemon/Overview.html
[13]: 廣域信息查詢系統(tǒng)(WAIS) - https://en.wikipedia.org/wiki/Wide_area_information_server
[14]: Brewster Kahle - http://brewster.kahle.org/about/
[15]: Internet Archive - https://archive.org/index.php
[16]: 如何添加一個搜索功能 - http://1997.webhistory.org/www.lists/www-talk.1993q1/0109.html
[17]: Gateway to the U Mich Geography server - https://lists.w3.org/Archives/Public/www-talk/1992NovDec/0060.html
[18]: 回復(fù)了 - https://lists.w3.org/Archives/Public/www-talk/1992NovDec/0069.html
[19]: Perl HTTPD - https://web.archive.org/web/19970720025822/http://www.cs.indiana.edu/perl-server/code.html
[20]: 設(shè)計原則 - https://web.archive.org/web/19970720025822/http://www.cs.indiana.edu/perl-server/intro.html
[21]: 提到過 - https://web.archive.org/web/19980122184328/http://www.cs.indiana.edu/perl-server/history.html
[22]: Finger 網(wǎng)關(guān) - https://web.archive.org/web/19990429014629/http://www.cs.indiana.edu:800/finger/gateway
[23]: 公布 - https://web.archive.org/web/19970720205155/http://www.cs.indiana.edu/canada/karla.html
[24]: 一種基于 Web 的、可搜索的出版物索引 - https://web.archive.org/web/19990428030253/http://www.cs.indiana.edu:800/cstr/search
[25]: Plexus - https://web.archive.org/web/19990421192342/http://www.earth.com/server/doc/plexus.html
[26]: 直接影響了 - http://1997.webhistory.org/www.lists/www-talk.1993q4/0516.html
[27]: 這里下載 tarball - https://web.archive.org/web/20011126190051/http://www.cs.indiana.edu/perl-server/httpd.pl.tar.Z
[28]: pinterest.com - https://www.pinterest.com/pin/146930006563199552/
[29]: Michael Stevenson - https://opensource.com/users/mstevenson
[30]: LCTT - https://github.com/LCTT/TranslateProject
TypeScript 的起源是由微軟公司開發(fā),其首席架構(gòu)師是 Anders Hejlsberg。Anders 是 Delphi 和 C# 語言的創(chuàng)始人,于2012年從微軟發(fā)布了 TypeScript。
TypeScript 誕生的原因是為了解決 JavaScript 的一些缺點,比如 JavaScript 缺乏強類型,沒有模塊化等。TypeScript 的目標是擴展 JavaScript 的能力并提高開發(fā)者的生產(chǎn)效率。
相較于 JavaScript,TypeScript 更接近于強類型靜態(tài)編程語言。它在 JavaScript 的基礎(chǔ)上,增加了一些靜態(tài)類型檢測的功能。這些功能可以幫助開發(fā)者在編寫代碼的時候更快速地找到潛在的錯誤,并且縮小了調(diào)試時的范圍。
TypeScript 還提供了面向?qū)ο缶幊痰奶匦裕?/span>類、泛型、接口等。這些特性可以大大提高代碼的可維護性,讓代碼更簡潔、易讀、可擴展和可重構(gòu)。
總而言之,TypeScript 是一個讓 JavaScript 更加加強的超集語言,它提供了更多的優(yōu)點和特性,使得大型項目和團隊開發(fā)變得更加容易。
TypeScript 和 JavaScript 的關(guān)系是 TypeScript 擴展了 JavaScript。
即 TypeScript 是 JavaScript 的超集。
TypeScript 可以編寫更高效的 JavaScript 代碼,提高開發(fā)的效率和代碼的可維護性。
TypeScript 提供了靜態(tài)類型系統(tǒng), 這使得很多編碼問題在編寫代碼時就可以被發(fā)現(xiàn)并解決。而 JavaScript 是動態(tài)類型語言,因此沒有這些優(yōu)勢,很多錯誤只有運行時才能被發(fā)現(xiàn)。
TypeScript 還提供了面向?qū)ο缶幊痰恼Z法。它可以使用類、接口等描述代碼組織結(jié)構(gòu)和功能,這些都是 JavaScript 所缺乏的。
TypeScript 的代碼可以直接編譯成 JavaScript,所以使用 TypeScript 編寫代碼時可以更加自由與靈活地選擇是否使用 TypeScript 的特性。
因為 TypeScript 是 JavaScript 的超集,因此 TypeScript 的所有特性都可以在 JavaScript 中使用。可以使用類、接口等特性編寫面向?qū)ο蟮?JavaScript 代碼,同時使用 JavaScript 特有的語法和特性。
總而言之,TypeScript 和 JavaScript 是強關(guān)聯(lián)、兼容與相互促進的。它們的關(guān)系如同 XML 與 HTML 之于 SGML(標準通用標記語言)那樣,TypeScript 是 JavaScript 的更高級的擴展,JavaScript 是通用編程語言,而 TypeScript 擴展了它。
TypeScript 的主要特點有:
總而言之,TypeScript 主要特點包括靜態(tài)類型、支持 ES6+ 新特性、支持面向?qū)ο缶幊獭⒖蓴U展、跨平臺兼容性、規(guī)范化、類型注解等。這些優(yōu)點使得 TypeScript 得到了廣泛的應(yīng)用和支持,并成為了一個備受關(guān)注的編程語言。
安裝 TypeScript,步驟如下:
npm install -g typescript
這個命令將會全局安裝最新版本的 TypeScript。
tsc -v
如果命令行返回了 TypeScript 的版本號,則表示 TypeScript 安裝成功。
現(xiàn)在你已經(jīng)成功安裝了 TypeScript!
TypeScript 是一種開放源代碼編程語言,它可以與多個流行的集成開發(fā)環(huán)境 (IDE) 配合使用,以提高開發(fā)效率。
以下是幾種常用的 IDE 的 TypeScript 集成方法:
總的來說,使用 TypeScript 的好處是它可以提供更好的代碼可讀性和可維護性。無論你使用哪種 IDE,TypeScript 的集成只需要簡單的步驟,以便更高效的創(chuàng)建高質(zhì)量的 TypeScript 應(yīng)用程序。
TypeScript 代碼需要被編譯成可運行的 JavaScript 代碼,因為瀏覽器和 Node.js 無法直接運行 TypeScript。
以下是一些編譯 TypeScript 的方法:
tsc filename.ts
tsc
這將編譯 tsconfig.json 中指定的所有 TypeScript 文件。
以上是幾種編譯 TypeScript 的方法。為了更高效地編寫 TypeScript 代碼,推薦使用 tsconfig.json 文件來編譯整個 TypeScript 項目。
在 TypeScript 中,數(shù)據(jù)類型依據(jù)值的類型進行分類,主要包括以下類型:
以上是 TypeScript 中常用的數(shù)據(jù)類型。使用正確的數(shù)據(jù)類型可以提高代碼的可讀性和性能,并且避免在代碼運行時出現(xiàn)錯誤。
在 TypeScript 中,有兩種聲明變量的方式:使用 var 和使用 let 關(guān)鍵字。在 ES6 中,let 關(guān)鍵字是引入的,它是塊級作用域。除了使用 var 和 let 之外,還可以使用 const 關(guān)鍵字來聲明常量,一旦賦值之后值不會改變。以下是這三種聲明方式的例子:
var x=10;
function example() {
var y=2;
}
console.log(x); // 10
console.log(y); // 報錯,y 在函數(shù)作用域之外不可用
let x=10;
function example() {
let y=2;
if (true) {
let z=3;
}
}
console.log(x); // 10
console.log(y); // 報錯,y 在函數(shù)作用域之外不可用
console.log(z); // 報錯,z 在塊級作用域之外不可用
const x=10;
// x=5; 報錯,常量的值一旦被賦值后不能改變
總的來說,使用 let 和 const 關(guān)鍵字聲明變量和常量可以避免作用域和重新賦值的問題。在 TypeScript 中,推薦使用 let 和 const 關(guān)鍵字來聲明變量和常量,以提高代碼的可讀性和可維護性。
在 TypeScript 中,函數(shù)是一種非常重要的語言特性。函數(shù)是一段可重用的代碼塊,用于執(zhí)行某個特定的任務(wù)。
以下是 TypeScript 中常用的函數(shù)相關(guān)的語法:
function add(x: number, y: number): number {
return x + y;
}
function drawImage(url: string, width?: number, height?: number): void {
// 使用默認的高度和寬度
if (!width) {
width=100;
}
if (!height) {
height=100;
}
// 加載圖像并繪制圖像
}
function multiply(multiplier: number, ...theNumbers: number[]): number {
return theNumbers.reduce((prev, curr)=> {
return prev * curr;
}, multiplier);
}
let square=function(x: number): number {
return x * x;
};
let add=(x: number, y: number): number=> {
return x + y;
};
總的來說,函數(shù)是 TypeScript 中的重要組成部分,提供了一種強大、可重用的代碼塊來執(zhí)行特定的任務(wù)。在聲明函數(shù)時,可以為函數(shù)指定參數(shù)和返回值類型,并且可以使用可選參數(shù)、默認值、剩余參數(shù)、匿名函數(shù)和箭頭函數(shù)等語法。
TypeScript 是一種靜態(tài)類型的開發(fā)語言,它是 JavaScript 的超集,可以編寫面向?qū)ο螅∣OP)的代碼。TypeScript 支持類、繼承、抽象類、接口等 OOP 概念,讓開發(fā)者編寫更加結(jié)構(gòu)化和可維護的代碼。
下面是 TypeScript 中聲明類的基本語法:
class Person {
firstName: string;
lastName: string;
constructor(firstName: string, lastName: string) {
this.firstName=firstName;
this.lastName=lastName;
}
getFullName(): string {
return `${this.firstName} ${this.lastName}`;
}
}
上面的代碼定義了一個名為 Person 的類,它擁有兩個公共的屬性 firstName 和 lastName,還有一個構(gòu)造函數(shù)用來初始化這兩個屬性。getFullName() 是一個公共方法,用來返回 Person 實例的全名。
接下來是如何創(chuàng)建 Person 類的實例:
const person=new Person('John', 'Doe');
console.log(person.getFullName());
上面的代碼會輸出 John Doe。
繼承是面向?qū)ο缶幊痰囊粋€重要概念, TypeScript 也支持類繼承。下面是一個繼承案例:
class Employee extends Person {
companyName: string;
constructor(firstName: string, lastName: string, companyName: string) {
super(firstName, lastName);
this.companyName=companyName;
}
getFullName(): string {
return `${super.getFullName()} - ${this.companyName}`;
}
}
上面的代碼定義了一個名為 Employee 的類,繼承自 Person 類。Employee 類有一個新的屬性 companyName,還有一個構(gòu)造函數(shù)和一個重寫的 getFullName() 方法。
現(xiàn)在我們可以創(chuàng)建 Employee 類的實例:
const employee=new Employee('John', 'Doe', 'ABC Corp');
console.log(employee.getFullName());
上面的代碼會輸出 John Doe - ABC Corp。
TypeScript 的面向?qū)ο缶幊谈拍钸€包括抽象類、接口、訪問修飾符等,這些概念能夠協(xié)助開發(fā)者管理類的狀態(tài)和行為,讓代碼更加清晰易懂。
TypeScript 具有靜態(tài)類型檢查的特性,它可以使用類型注解來明確變量、參數(shù)、函數(shù)等的類型。此外,類型注解還可以提高代碼可讀性和可維護性,減少類型相關(guān)的錯誤。
下面是一些基本的類型注解例子:
// 聲明變量 age 為 number 類型
let age: number=30;
// 聲明數(shù)組 numbers 中每個元素都為 number 類型
let numbers: number[]=[1, 2, 3, 4];
// 聲明對象 person 中的屬性 firstName 和 lastName 分別為 string 類型
let person: { firstName: string, lastName: string }={ firstName: 'John', lastName: 'Doe' };
// 聲明函數(shù) getFullName 參數(shù) firstName 和 lastName 都為 string 類型,返回 string 類型
function getFullName(firstName: string, lastName: string): string {
return `${firstName} ${lastName}`;
}
當類型注解不匹配時,TypeScript 會給出類型錯誤提示。例如,下面的代碼會在編譯時報錯:
let name: string='John';
// 下面這行代碼會編譯時錯誤,因為 'number' 類型不能賦值給 'string' 類型
name=30;
除了上述的基本類型,TypeScript 還提供了很多內(nèi)置類型和高級類型,例如元組、枚舉、聯(lián)合類型、交叉類型等。使用這些類型注解,可以讓開發(fā)者更好地管理和維護代碼。
TypeScript 中的泛型(Generics)是實現(xiàn)可重用性的一種強大工具,它可以用來創(chuàng)建具有靈活參數(shù)類型的函數(shù)、類和接口。泛型可以讓代碼變得更加可讀、可維護和可擴展。
下面是一個簡單的泛型函數(shù)示例:
function getArray<T>(items: T[]): T[] {
return new Array().concat(items);
}
let numArray: number[]=[1, 2, 3, 4];
let strArray: string[]=['one', 'two', 'three'];
let concatNumArray: number[]=getArray<number>(numArray);
let concatStrArray: string[]=getArray<string>(strArray);
上面的代碼使用了一個泛型函數(shù) getArray,它接受一個類型為 T 的數(shù)組 items 作為參數(shù),然后返回一個類型為 T 的新數(shù)組。在上面的調(diào)用中,我們分別使用了 number 和 string 作為類型參數(shù)調(diào)用了 getArray 函數(shù),返回了新的數(shù)組類型。
除了泛型函數(shù),TypeScript 中還有泛型類和泛型接口。下面是一個泛型類示例:
class Queue<T> {
private data: T[]=[];
push(item: T) {
this.data.push(item);
}
pop(): T | undefined {
return this.data.shift();
}
}
let q=new Queue<number>();
q.push(1);
q.push(2);
console.log(q.pop()); // output: 1
console.log(q.pop()); // output: 2
上面的代碼展示了一個名為 Queue 的泛型類,它包含一個私有數(shù)據(jù)成員 data 和兩個方法 push 和 pop。可以看到,在實例化 Queue 類時,我們可以指定泛型類型為 number,然后向隊列中加入了兩個 number 類型的元素。最后通過 pop 方法分別彈出兩個元素并打印結(jié)果。
通過泛型,TypeScript 可以實現(xiàn)更加靈活的代碼類型,便于復(fù)用和維護,適用于多種場景。
TypeScript 中的接口是一種定義代碼契約、規(guī)范行為的方式,它主要用于描述對象的形狀和行為。接口可以讓開發(fā)者明確代碼的輸入和輸出,提高代碼的健壯性和可讀性。
下面是一個基本的接口示例:
interface IPerson {
firstName: string;
lastName: string;
age: number;
}
function greet(person: IPerson) {
console.log(`Hello, ${person.firstName} ${person.lastName}!`);
}
let user={ firstName: 'John', lastName: 'Doe', age: 30 };
greet(user);
上面的代碼中,我們定義了一個名為 IPerson 的接口,它包含三個屬性:firstName、lastName 和 age。然后我們定義了一個名為 greet 的函數(shù),它接受一個類型為 IPerson 的參數(shù),函數(shù)內(nèi)部根據(jù)傳入?yún)?shù)輸出字符串。最后我們定義了一個變量 user,它包含了 firstName、lastName 和 age 三個屬性,并把它傳入 greet 函數(shù)中。
在 TypeScript 中,接口可以表示更加復(fù)雜的對象形狀,包括可選屬性、只讀屬性、函數(shù)類型和繼承等。例如,下面是一個包含可選屬性和函數(shù)類型的接口示例:
interface IEmployee {
firstName: string;
lastName: string;
age?: number;
getFullName: ()=> string;
}
let employee: IEmployee={
firstName: 'John',
lastName: 'Doe',
getFullName: function() {
return `${this.firstName} ${this.lastName}`;
}
};
console.log(employee.getFullName()); // output: John Doe
上面的代碼中,我們定義了一個名為 IEmployee 的接口,其中 age 屬性是可選的,getFullName 屬性是函數(shù)類型。然后我們創(chuàng)建了一個名為 employee 的對象,它包括 firstName、lastName 和 getFullName 三個屬性,并通過 getFullName 屬性返回了全名字符串。
總之,接口是一種強大的代碼規(guī)范和約束方式,能夠提高代碼的可讀性、可維護性和可擴展性,適用于多種場景。
TypeScript 可以與各種框架集成,使開發(fā)者能夠使用 TypeScript 強大的類型檢查和自動補全功能,提高代碼可靠性和開發(fā)效率。
下面是一些 TypeScript 與常見框架集成的簡單示例:
在 Vue.js 中使用 TypeScript 可以提供更加明確的代碼類型和語法檢查,通過安裝 Vue.js 的官方插件 vue-cli-plugin-typescript 可以輕松的將 Vue.js 與 TypeScript 集成。同時,Vue.js 的文檔中也提供了 TypeScript 的使用指南。
使用 TypeScript 和 Vue.js 來編寫一個簡單的組件:
<template>
<div>
<p>{{ message }}</p>
</div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
@Component
export default class MyComponent extends Vue {
private message='Hello, World!';
}
</script>
上面的代碼采用了 TypeScript 語法,使用了 Vue.js 的裝飾器 @Component,聲明了一個名為 MyComponent 的組件,并給出了一個私有的屬性 message 并賦值為字符串。
在 React 中可以通過多種方式使用 TypeScript,例如使用 create-react-app 來創(chuàng)建一個基于 TypeScript 的項目框架,或者手動配置 TypeScript 和 React 的集成環(huán)境。React 提供了完整的官方文檔來說明如何使用 TypeScript 構(gòu)建 React 應(yīng)用。
以 create-react-app 為例,創(chuàng)建基于 TypeScript 的 React 應(yīng)用框架示例:
npx create-react-app my-app --typescript
然后創(chuàng)建一個名為 MyComponent 的 React 組件:
import React from 'react';
interface IProps {
message: string;
}
const MyComponent: React.FC<IProps>=({ message })=> {
return (
<div>
<p>{message}</p>
</div>
);
};
上面的代碼采用了 TypeScript 語法,定義了一個名為 IProps 的接口,表示 MyComponent 組件的屬性類型。通過使用 React.FC 泛型來使用這個接口,使得 MyComponent 組件接收一個名為 message 的字符串類型的屬性,返回一個包含一個 p 標簽的 div 元素并輸出 message 屬性的內(nèi)容。
結(jié)論:
TypeScript 可以與各種框架集成,例如 Vue.js、React、Angular 等,使開發(fā)者能夠使用 TypeScript 強大的類型檢查和自動補全功能來提高代碼可靠性和開發(fā)效率,適合于大型和復(fù)雜的應(yīng)用程序開發(fā)。
TypeScript 在以下場景中擁有較為廣泛的應(yīng)用:
總之,TypeScript 可以被廣泛應(yīng)用于各種類型的項目開發(fā)中,提高代碼的可靠性、可讀性和可維護性,適用于大多數(shù)的 Web 開發(fā)項目。
下面是兩個 TypeScript 應(yīng)用案例的簡介:
Angular 是 Google 推出的一款前端 MVC 框架,它完全采用 TypeScript 編寫。Angular 提供了非常完整的組件化開發(fā)框架,擁有很高的可復(fù)用性和可維護性。Angular 的 TypeScript 特性,如靜態(tài)類型檢查、類型推導(dǎo)等等,能夠大大提高代碼的可讀性和可維護性。
NestJS 是一個用于構(gòu)建可擴展和高效的 Web 應(yīng)用程序的 Node.js Web 框架,它使用 TypeScript 編寫。NestJS 借鑒了 Angular 中的設(shè)計思路和模式,提供了類似 Angular 的裝飾器、依賴注入和模塊化編程的方案,使得開發(fā)者能夠更快速、高效地構(gòu)建 Node.js 應(yīng)用程序。
總體來說,TypeScript 能夠在多個領(lǐng)域發(fā)揮作用,提高代碼的可擴展性和可維護性,同時也能增強開發(fā)者對代碼的把控和安全性。無論是大型前端框架還是后端 Node.js 應(yīng)用程序,都可以通過 TypeScript 發(fā)揮技術(shù)和業(yè)務(wù)價值。
下面是一些編寫 TypeScript 代碼的建議:
總之,編寫 TypeScript 代碼需要一定的 JavaScript 基礎(chǔ)和 TypeScript 特性的掌握,同時需要寫出詳細的類型聲明,合理利用 TypeScript 的工具和插件,并熟悉 TypeScript 的編譯過程。
以下是一些遵循良好的 TypeScript 代碼風(fēng)格的指南:
總之,遵循良好的 TypeScript 代碼風(fēng)格可以提高代碼的可讀性、可維護性和可擴展性,同時也能夠更好地協(xié)作和構(gòu)建具有高質(zhì)量的代碼庫。
TypeScript 與 JavaScript 的兼容性問題主要體現(xiàn)在兩個方面:
1. TypeScript 編譯后的 JavaScript 代碼是否能夠運行在原生的 JavaScript 環(huán)境中。
解決方案:TypeScript 支持通過編譯選項配置目標 JavaScript 版本。通過指定目標 JavaScript 版本,可以確保生成的 JavaScript 代碼能夠在目標環(huán)境中運行。同時,TypeScript 還提供了對 ES5、ES6、ES7 的語言特性支持,可以根據(jù)實際項目需求選擇相應(yīng)的編譯選項。
2. JavaScript 庫或框架中的聲明文件與 TypeScript 聲明文件不一致,導(dǎo)致類型錯誤和運行時錯誤。
解決方案:一種方法是使用第三方庫的 TypeScript 版本,如果不存在,則自己創(chuàng)建類型聲明文件,或者使用第三方提供的類型聲明文件。
另外,建議在使用 JavaScript 庫或框架時,盡量避免使用 any 類型,以避免類型錯誤和難以維護的代碼。可以通過為第三方庫編寫類型聲明文件的方式來避免 any 類型的使用。
總之,TypeScript 和 JavaScript 之間的兼容性問題可以通過相應(yīng)的編譯選項和類型聲明文件來解決。同時,盡可能減少對 any
類型的使用也可以提高代碼質(zhì)量和可讀性。
以下是幾個 TypeScript 中常用的異步控制工具:
1. Promise
Promise 是 ES6 中引入的一種異步編程解決方案。在 TypeScript 中,可以借助 Promise 來處理異步任務(wù)的完成和失敗,使得代碼更加易讀和易維護。
2. Async/Await
Async/Await 是 ES2017 中引入的一種異步編程解決方案,可以直接處理基于 Promise 的異步操作。在 TypeScript 中,可以使用 Async/Await 語法來進行同步式的異步編程,簡化代碼結(jié)構(gòu),提高代碼質(zhì)量。
3. RxJS
RxJS 是一個使用 Observables 來處理異步和事件的庫。Observables 是表示異步數(shù)據(jù)流的對象,具有強大的操作符和方法來處理數(shù)據(jù)的變換和流控制。因此,在 TypeScript 中使用 RxJS 可以極大地簡化異步操作的代碼,同時也提供了更多的數(shù)據(jù)流處理的能力。
4. Bluebird
Bluebird 是一個 Promise 庫,支持 Promise 的鏈式調(diào)用、多個 Promise 的并行和序列等操作。在 TypeScript 中使用 Bluebird 可以讓我們更好地控制 Promise 的流程,從而簡化異步異步程序的編寫。
綜上所述,以上這些工具都是 TypeScript 中常用的異步控制工具,可以讓我們更好地處理異步任務(wù)。在選擇工具時,可以根據(jù)實際需求選擇合適的工具,以便提高代碼質(zhì)量、可讀性和可維護性。
以下是常用的 TypeScript 單元測試工具:
1. Jest
Jest 是一個流行的 JavaScript 單元測試框架,可以用于測試 JavaScript 和 TypeScript 代碼。它具有簡單易用、快樂生產(chǎn)、提供了覆蓋率報告、支持并發(fā)測試等特點。Jest 可以很容易地集成 CI/CD 工具,并在開發(fā)過程中持續(xù)運行測試,并報告任何可能的錯誤。
2. Mocha
Mocha 是另一個流行的 JavaScript 單元測試框架,它可以用于測試 JavaScript 和 TypeScript 代碼。它具有支持任何斷言庫、支持異步和同步代碼測試、易于擴展等特點。Mocha 還支持在瀏覽器和 Node.js 環(huán)境中運行測試。
3. Chai
Chai 是一個可擴展的 BDD/TDD 斷言庫,可以與 Mocha 和其他 JavaScript 測試框架一起使用。Chai 具有靈活的語法和支持鏈式表達式等優(yōu)點,可以幫助我們更好的編寫測試代碼,以確保代碼質(zhì)量和可讀性。
4. Sinon
Sinon 是一個 JavaScript 測試工具庫,可以幫助我們模擬對象、函數(shù)和 API 調(diào)用。在 TypeScript 中,我們可以使用 Sinon 來測試異步代碼、模擬函數(shù)的返回值和異常等。
5. Testcafe
Testcafe 是一個跨平臺自動化瀏覽器測試工具。它可以在真實的瀏覽器中運行測試,以提供最真實的測試結(jié)果。Testcafe 也支持 TypeScript,在測試代碼中具有類型檢查的能力。
總之,以上這些工具都可以用于 TypeScript 單元測試,我們可以根據(jù)實際需求選擇適合的工具。無論是 Jest、Mocha 還是 Chai、Sinon,甚至是 Testcafe,它們都有著強大的測試和斷言能力,幫助我們更好地測試我們的 TypeScript 代碼。
以下是常用的 TypeScript 依賴注入工具:
1. InversifyJS
InversifyJS 是一個輕量級的 TypeScript 依賴注入庫,它可以幫助我們輕松地進行依賴注入和控制反轉(zhuǎn),以便更好地組織我們的應(yīng)用程序。其特點包括基于裝飾器注入、支持異步加載、可擴展和易于調(diào)試等。
2. tsyringe
tsyringe 是另一個輕量級的 TypeScript 依賴注入工具,它提供了基于裝飾器和類型元數(shù)據(jù)的依賴注入機制,以及類型安全、可配置和可擴展的特性。tsyringe 還支持實例范圍、生命周期、條件注入和延遲加載等高級特性。
3. Awilix
Awilix 是一個功能齊全的 JavaScript 依賴注入庫,可以完美地支持 TypeScript。它提供了類似 InversifyJS 和 tsyringe 的基于裝飾器的注入機制,以及可擴展、可測試和可配置的特性。Awilix 還可以與其他 JS 技術(shù),如 Express、Passport 和 Socket.IO,無縫集成。
4. Nest
Nest 是一個基于 Node.js 和 TypeScript 的應(yīng)用程序框架,致力于提供高層次的抽象和易于開發(fā)的解決方案。Nest 內(nèi)置了一個依賴注入容器,可以直接支持控制反轉(zhuǎn)和依賴注入,而不需要使用第三方庫。
總之,以上這些工具都是常用的 TypeScript 依賴注入工具,我們可以根據(jù)實際需求選擇適合我們的工具。無論是 InversifyJS、tsyringe,還是 Awilix 和 Nest,它們都有著不同的優(yōu)點和特點,可以幫助我們更好地組織和管理我們的應(yīng)用程序代碼。
以下是 TypeScript 的發(fā)展趨勢:
1. 與 React、Angular、Vue 等前端框架一起使用
由于 TypeScript 具有類型安全、可讀性和可維護性等特點,與 React、Angular、Vue 等前端框架一起使用的趨勢將會繼續(xù)發(fā)展。React、Angular、Vue 三大框架都對 TypeScript 的支持不斷增強,許多流行的 UI 庫和組件庫已經(jīng)開始采用 TypeScript 進行開發(fā)和維護。
2. 實現(xiàn)更好的類型系統(tǒng)和編譯器特性
TypeScript 已經(jīng)擁有了強大的類型系統(tǒng)和編譯器特性,而未來的發(fā)展趨勢將集中在使它們更好,并進一步提高代碼質(zhì)量和開發(fā)效率。例如,TypeScript 的類型系統(tǒng)可以進一步支持對連鎖方法、裝飾器、解構(gòu)等高級語言特性的類型推導(dǎo)和檢查。
3. 集成更多的編輯器和 IDE
TypeScript 已經(jīng)得到了許多流行的編輯器和 IDE 的支持,例如 VS Code、WebStorm、Atom 等等。未來,TypeScript 可能會更多地與其他工具和平臺進行集成,以進一步提高開發(fā)效率、便捷性和可讀性。
4. 支持 WebAssembly
WebAssembly 是一種低級別的字節(jié)代碼格式,目前已經(jīng)得到了越來越廣泛的支持。TypeScript 可能會在未來支持 WebAssembly,從而讓開發(fā)者能夠更加輕松地編寫和調(diào)試 WebAssembly 應(yīng)用程序。
綜上所述,TypeScript 的發(fā)展趨勢是與前端框架一起使用、實現(xiàn)更好的類型系統(tǒng)和編譯器特性、集成更多的編輯器和 IDE,以及支持 WebAssembly。這些趨勢將進一步提高 TypeScript 的普及率和應(yīng)用場景,幫助開發(fā)者更高效地編寫高質(zhì)量的應(yīng)用程序。
TypeScript 對企業(yè)級應(yīng)用的貢獻主要體現(xiàn)在以下幾個方面:
1. 可維護性和代碼質(zhì)量
TypeScript 的類型系統(tǒng)可以幫助開發(fā)者更好地描述和控制代碼行為,減少代碼中的潛在錯誤和漏洞。TypeScript 還提供了一系列的開發(fā)工具和功能,如類型推導(dǎo)、高級語法和編輯器工具支持,這些都可以幫助開發(fā)者更好地管理和維護企業(yè)級應(yīng)用,提高代碼質(zhì)量和可維護性。
2. 可讀性和可擴展性
TypeScript 的類型注解和代碼結(jié)構(gòu)可以幫助人類開發(fā)者更好地理解和閱讀代碼,使得代碼更加易于理解和擴展。TypeScript 還提供了與現(xiàn)代前端框架(如 React、Vue、Angular)和后端系統(tǒng)(如 Node.js)進行深度集成的能力,使得開發(fā)者可以更好地利用現(xiàn)有的工具和技術(shù)來開發(fā)企業(yè)級應(yīng)用。
3. 生態(tài)和社區(qū)
TypeScript 的持續(xù)發(fā)展和社區(qū)推動也為企業(yè)級應(yīng)用的發(fā)展做出了貢獻。TypeScript 有一個龐大的社區(qū)和生態(tài)系統(tǒng),開發(fā)者可以在這個社區(qū)中找到大量的支持、文檔、教程、工具和解決方案,以滿足日益增長的企業(yè)需求。
4. 敏捷開發(fā)和自動化測試
TypeScript 的靜態(tài)類型系統(tǒng)可以幫助開發(fā)者更好地理解軟件代碼和架構(gòu),同時也可以快速識別代碼中的錯誤和故障。這些特性還可以幫助企業(yè)在軟件開發(fā)和自動化測試方面更加運用敏捷開發(fā)和DevOps實踐,以加快軟件應(yīng)用的交付和上線速度。
綜上所述,TypeScript 對企業(yè)級應(yīng)用的貢獻主要包括提高可維護性和代碼質(zhì)量、提高可讀性和可擴展性、為企業(yè)級應(yīng)用提供具有價值的生態(tài)和社區(qū),以及支持敏捷開發(fā)和自動化測試。這些貢獻使得企業(yè)級應(yīng)用可以更加高效、可靠和安全地運轉(zhuǎn),滿足企業(yè)級應(yīng)用的需求。
TypeScript 和 JavaScript 均為主流的編程語言,各自有著不同的應(yīng)用場景和發(fā)展趨勢。
以下是 TypeScript 與 JavaScript 的趨勢比較:
1. 類型系統(tǒng)
TypeScript 與 JavaScript 最大的差異在于類型系統(tǒng),TypeScript 進一步強化了 JavaScript 的類型系統(tǒng),使得開發(fā)者能夠更加準確和安全地編寫代碼。隨著 TypeScript 的不斷發(fā)展,類型系統(tǒng)將成為 TypeScript 與 JavaScript 的又一重要區(qū)別。
2. 支持 frameworks
TypeScript 目前得到了 React、Vue 和 Angular 等流行的前端框架的廣泛支持,這些框架提供了更多的Typing和其他TypeScript功能。與此相比,JavaScript 的支持范圍更廣,無論前后端開發(fā)和框架都可以使用。
3. 社區(qū)生態(tài)
JavaScript 已經(jīng)擁有了一個經(jīng)過多年發(fā)展的社區(qū)和生態(tài)系統(tǒng),在許多項目中都得到了廣泛的應(yīng)用和支持。然而,TypeScript 在近年來也逐漸發(fā)展壯大,擁有龐大的社區(qū)和生態(tài)系統(tǒng),并且正在獲得更多的關(guān)注和應(yīng)用。
4. 學(xué)習(xí)成本
由于 TypeScript 是建立在 JavaScript 基礎(chǔ)之上進行擴展的,因此學(xué)習(xí) TypeScript 的過程會比學(xué)習(xí) JavaScript 的過程更具挑戰(zhàn)性。需要掌握更多的 TypeScript 語言特性和類型系統(tǒng),此外還需要大量的實踐和訓(xùn)練來應(yīng)對類型推導(dǎo)和類型判斷等問題。
綜上所述,TypeScript 和 JavaScript 都有著各自的優(yōu)點和特點。TypeScript 發(fā)展的趨勢是越來越好的類型系統(tǒng)、更廣泛的框架和生態(tài)支持,而 JavaScript 發(fā)展的趨勢則主要體現(xiàn)在更普及和更廣泛的應(yīng)用場景。在實際應(yīng)用中,我們可以根據(jù)項目的具體需求選擇 TypeScript 或 JavaScript,或者兩者結(jié)合使用,以便更好地滿足應(yīng)用程序的需求。
以下是 TypeScript 的優(yōu)點:
1. 更好的可讀性和可維護性
TypeScript 引入了類型注解和類的概念,可以顯著提高代碼的可讀性和可維護性。這些特性可以讓開發(fā)者更好地了解代碼的行為,同時也可以排除一些常見的編程錯誤。
2. 更安全的編程環(huán)境
TypeScript 可以通過類型檢查,避免在代碼中出現(xiàn)類型錯誤,在編碼階段就暴露一些潛在的問題,可以避免一些錯誤在運行時才出現(xiàn),提高了代碼的穩(wěn)定性和可靠性。同時,TypeScript 還可以減少由于類型轉(zhuǎn)換錯誤導(dǎo)致的運行時錯誤,提高代碼的安全性。
3. 更好的 IDE 支持
TypeScript 可以提供比 JavaScript 更好的類型驗證,所以絕大部分 IDE 可以對 TypeScript 進行語法和類型補全。這樣可以在編碼過程中減少手動輸入和抵御語法錯誤,從而提高開發(fā)效率。
4. 更好的與第三方庫的集成
現(xiàn)在大量的 JavaScript 庫已經(jīng)使用 TypeScript 進行開發(fā),很多流行的前端框架和庫,包括 React、Angular 和 Vue,都對 TypeScript 的支持非常友好。使用 TypeScript 可以更好地集成這些第三方庫和框架,同時保持類型安全和可維護性。
5. 更快的開發(fā)速度和更少的錯誤
TypeScript 可以提高開發(fā)團隊的效率,同時也能夠減少代碼中的錯誤,降低修復(fù)錯誤的成本和時間。與傳統(tǒng)的 JavaScript 相比,TypeScript 精準的類型檢查和更好的可組合性可以在項目開發(fā)中更自信地進行迭代和協(xié)作。
綜上所述,TypeScript 具有更好的可讀性和可維護性、更安全的編程環(huán)境、更好的 IDE 支持、更好的第三方庫的集成以及更快的開發(fā)速度和更少的錯誤等優(yōu)點。這些優(yōu)點使得 TypeScript 在日益增長的應(yīng)用場景中被廣泛應(yīng)用,可為企業(yè)級應(yīng)用和后端項目節(jié)省大量時間和資源。
TypeScript 作為一門面向?qū)ο蠛挽o態(tài)類型的編程語言,與其他編程語言有著一些共性和差異。
TypeScript 是基于 JavaScript 的一種超集,它擴展了 JavaScript 的基礎(chǔ)類型系統(tǒng)和語法,提高了代碼的可讀性和可維護性。TypeScript 支持與 JavaScript 代碼無縫協(xié)作,并且可以直接編譯成 JavaScript 代碼運行在瀏覽器或者 Node.js 環(huán)境中。
與 Java 不同的是,TypeScript 是一種面向?qū)ο笳Z言,但是它不像 Java 那樣強制使用類和接口來構(gòu)造對象,而是允許使用更加靈活的類型和架構(gòu)。此外,TypeScript 擁有更短的開發(fā)環(huán)節(jié)、更容易學(xué)習(xí)、更少的等待時間、更強大的 IDE 支持以及更豐富的社區(qū)支持等優(yōu)點。
與 Python 相比,TypeScript 擁有更加強大的類型系統(tǒng)和靜態(tài)類型檢查,可以幫助開發(fā)者避免在使用時出現(xiàn)一些類型和語法錯誤,并且可以提供更好的 IDE 支持。Python 擁有更好的科學(xué)計算、人工智能等方面的擴展庫和生態(tài)支持。
TypeScript 和 C# 都是由 Microsoft 開發(fā)和維護的編程語言,它們有許多共性,例如靜態(tài)類型檢查、強類型和面向?qū)ο?/span>等特點。相比于 C#,TypeScript 更加輕量、便捷、靈活,開發(fā)團隊需要考慮更多的開發(fā)效率和代碼的可讀性。
綜上所述,TypeScript 與 JavaScript、Java、Python 和 C# 等語言有許多相似性和差異性。相互比較時需要考慮每種語言的特點和使用環(huán)境,選擇最適合當前項目的語言。
以下是使用 TypeScript 時的一些建議:
1. 評估項目框架和技術(shù)棧
在使用 TypeScript 之前,需要考慮項目的框架和技術(shù)棧是否支持 TypeScript。通常,大多數(shù)流行的前端框架和庫,包括 React、Vue 和 Angular 都對 TypeScript 的支持非常友好。同時也需要考慮是否使用 TypeScript 對于團隊或項目具有助益。
2. 開啟嚴格模式
TypeScript 嚴格模式(strict mode)可以讓 TypeScript 提供更強的類型推斷和類型檢查,從而減少代碼中的錯誤和漏洞。建議項目初期就開啟嚴格模式,確保代碼的質(zhì)量和穩(wěn)定性。
3. 確定合適的類型
TypeScript 可以為變量、函數(shù)、對象和屬性定義類型,建議在編寫代碼時使用合適的類型。這樣可以提高代碼的清晰度和可讀性,并且可減少一些開發(fā)中的錯誤。
4. 學(xué)習(xí) TS 的特性
學(xué)習(xí) TypeScript 的特性和語法是使用 TypeScript 的關(guān)鍵,建議利用在線資源或書籍系統(tǒng)地學(xué)習(xí) TypeScript。掌握更多的 TypeScript 特性,使其成為企業(yè)級應(yīng)用的基礎(chǔ)。
5. 利用 TypeScript 工具和插件
TypeScript 支持許多優(yōu)秀的工具和插件,包括編譯器、代碼檢查器、自動補全等。合理的使用這些工具和插件可以大大提高開發(fā)者的開發(fā)效率和代碼質(zhì)量。
綜上所述,使用 TypeScript 需要考慮項目框架和技術(shù)棧的適配性,建議開啟嚴格模式、確定合適的類型、充分了解 TypeScript 的特性,以及利用 TypeScript 工具和插件來協(xié)助開發(fā)。這些建議可以使開發(fā)者更好地利用 TypeScript 來提高項目質(zhì)量,并幫助團隊更好地管理和維護代碼庫。
頁開發(fā)者今天談?wù)摰氖强蚣堋⒑诵摹⒕W(wǎng)絡(luò)應(yīng)用程序和集成, 但是他們幾乎沒有為所有這些都是基于 HTML 的語言留下一個詞語。 自從萬維網(wǎng)誕生以來, 超文本標記語言就一直和我們在一起, 并且與互聯(lián)網(wǎng)一起進化, 提供了一種簡單易用的網(wǎng)頁創(chuàng)建方式。 沒有他們, 就沒有網(wǎng)站可以存在——即使是那些完全用 Flash 構(gòu)建的網(wǎng)站(當時有相當多的網(wǎng)站)需要它來嵌入他們的互動動畫。 無處不在, 從谷歌搜索結(jié)果到移動網(wǎng)絡(luò)應(yīng)用。 現(xiàn)在, 在第一次實施25年之后, 讓我們簡單地回顧一下它的歷史。
超文本標記語言最早是由著名的萬維網(wǎng)發(fā)明家蒂莫西 · 約翰 ·"蒂姆"· 伯納斯-李爵士首次提出。 他基于 SGMLguid 構(gòu)建了這個簡單的標記語言, 這是歐洲核子研究委員會內(nèi)部使用的標準文檔格式。 第一個公開的語言描述只包含了18個元素, 除了超鏈接標簽, 所有這些元素都受到 SGMLguid 的啟發(fā)。
今天可用的最早的 HTML 文檔有以下代碼:
第一個關(guān)于 HTML 規(guī)范的提案是1993年中期由 Berners-Lee 和 Dan Connolly 提出的一個名為"超文本標記語言"的網(wǎng)頁草案, 于1993年中期出版, 因此這是正式生成這種語言的時候。 這個草案連同1994年到期的 HTML + 草案, 直到1995年因特網(wǎng)工程工作隊(IETF)完成了"HTML 2.0"規(guī)范。 從那時起, 事情發(fā)生了很快的一段時間-HTML 3.2于1997年1月發(fā)布, 接著是同年12月的 HTML 4.0。 一年之后, W3C 發(fā)布了 HTML 4.01規(guī)范, 這些仍然是這種語言十多年來唯一的版本。
Html5是自1999年 HTML 4.01版本發(fā)布以來對 HTML 規(guī)范的第一次重大改革——正如許多人所說的那樣, 終于在1999年發(fā)布了 HTML 4.01。 這也給瀏覽器的標記提供方式帶來了嚴重的變化, 這些改變早就應(yīng)該發(fā)生了。 除其他外, 它還增加了一種本地處理多媒體和圖形內(nèi)容的方法, 并且增加了新的頁面結(jié)構(gòu)元素, 以增強文檔的語義內(nèi)容。
5.0成為2014年的一個推薦, HTML 5.1在2016年遭遇了同樣的命運, HTML 5.2在2017年12月14日作為 W3C推薦標準發(fā)布。 這就是我們今天的立場。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。