7個(gè)拒絕使用TypeScript的壞借口

譯者按: TypeScript 學(xué)習(xí)成本不高缕探,項(xiàng)目切換成本不低魂莫,不過(guò)還是值得試一試的!

為了保證可讀性爹耗,本文采用意譯而非直譯耙考。另外,本文版權(quán)歸原作者所有潭兽,翻譯僅用于學(xué)習(xí)倦始。

自從 6 年前誕生,TypeScript 逐漸被各大型公司接受讼溺。 也許你有充足的理由說(shuō)服自己不要使用它楣号,這些都讓你錯(cuò)失了 TypeScript。在這篇文章中怒坯,我會(huì)列舉大家為何不選用 TypeScript 的一些原因炫狱,比如學(xué)習(xí)曲線、工具剔猿、開(kāi)發(fā)效率视译、穩(wěn)定性以及對(duì)標(biāo)準(zhǔn)的兼容性。

1. 學(xué)習(xí)曲線過(guò)于陡峭

首先需要強(qiáng)調(diào)一點(diǎn):TypeScript 并不是一個(gè)完全嶄新的開(kāi)發(fā)語(yǔ)言归敬。像 CoffeeScript 和 Reason 吸收了 Ruby 和 OCaml 的語(yǔ)法和語(yǔ)義融入到 JavaScript 語(yǔ)言中酷含。TypeScript 從某種程度上說(shuō)鄙早,更加保守。

它只是在 JavaScript 的基礎(chǔ)上添加了類型系統(tǒng)(TypeScript 是 JavaScript 的超集)椅亚,所以它的學(xué)習(xí)曲線會(huì)相對(duì)平滑限番。特別是相對(duì)于完全切換到不同編程語(yǔ)言來(lái)說(shuō)。
下面是一段 TypeScript 代碼:

class Greeter {
  greeting: string;

  constructor(message: string) {
    this.greeting = message;
  }

  greet() {
    return "Hello, " + this.greeting;
  }
}

對(duì)比用 ES6 編寫的相同功能的代碼:

class Greeter {
  constructor(message) {
    this.greeting = message;
  }

  greet() {
    return "Hello, " + this.greeting;
  }
}

正如 TypeScript 語(yǔ)言的一個(gè)設(shè)計(jì)者 Anders Hejlsberg 說(shuō)到:“如果你懂得 JavaScript呀舔,那么你就已經(jīng)懂得 TypeScript 了弥虐。” 稍后,我會(huì)介紹如何將現(xiàn)有的項(xiàng)目切換到 TypeScript 去媚赖。

2. JavaScript 是標(biāo)準(zhǔn)霜瘪,TypeScript 不是

當(dāng) TypeScript 在 2012 年誕生的時(shí)候就有了類和模塊的概念,標(biāo)準(zhǔn) JavaScript 直到 2015 年都還沒(méi)有惧磺!

今天颖对,TypeScript 語(yǔ)言緊隨 ECMAScript 的定義,幾乎實(shí)現(xiàn)了Stage 3所有的提案磨隘。也就是說(shuō)缤底,當(dāng)你在使用 TypeScript 的時(shí)候,你其實(shí)已經(jīng)在用最新的 JavaScript琳拭。而且感謝 ES3/ES5 編譯器训堆,最終輸出的.js文件即使在舊版本的瀏覽器也不會(huì)出問(wèn)題。

3. 破壞了 JavaScript 的動(dòng)態(tài)性

如果你熟練使用腳本語(yǔ)言工作白嘁,你會(huì)喜歡它驚人的開(kāi)發(fā)效率坑鱼。你可以在代碼中隨時(shí)修改數(shù)據(jù)結(jié)構(gòu),而不必事先聲明絮缅。這種自由度鲁沥,也伴隨著代價(jià)。這種動(dòng)態(tài)語(yǔ)言有了 bug 有時(shí)候很難搞定耕魄,它不會(huì)像靜態(tài)語(yǔ)言一樣画恰,在編譯的時(shí)候有做類型的驗(yàn)證來(lái)保證代碼的正確性。

比如下面的 JavaScript 代碼:

function greeter(person) {
  return "Hello, " + person.firstName + " " + person.lastName;
}

通過(guò)代碼我們可以判斷 person 參數(shù)是一個(gè)對(duì)象吸奴,它有 firstName 和 lastName 兩個(gè)屬性允扇。但是我們無(wú)法保證在運(yùn)行時(shí)一定是這樣。

特別是當(dāng)你的項(xiàng)目越大则奥,和類型相關(guān)的 bug 就越可能觸發(fā)考润。

為了避免出現(xiàn)問(wèn)題,我們可以加上很多運(yùn)行時(shí)的驗(yàn)證读处,以及單元測(cè)試:

function greeter(person) {
  if (!person || !person.firstName || !person.lastName) {
    throw new Error("invalid arguments");
  }

  return "Hello, " + person.firstName + " " + person.lastName;
}

// Jasmine spec:
describe("greeter", function() {
  it("returns greeting on valid input", function() {
    expect(greeter({ firstName: "James", lastName: "Hetfield" })).toEqual(
      "Hello, James Hetfield"
    );
  });

  it("throws on invalid input", function() {
    expect(() => greeter()).toThrowError("invalid arguments");
    expect(() => greeter(5)).toThrowError("invalid arguments");
    expect(() => greeter({ firstName: "Jason" })).toThrowError(
      "invalid arguments"
    );
  });
});

但是糊治,這樣的實(shí)現(xiàn)方法很累贅,開(kāi)發(fā)者需要在每個(gè)函數(shù)前面都加上這樣的判斷來(lái)保證正確性罚舱。換個(gè)思路井辜,如果我們給函數(shù)的參數(shù)加上類型绎谦,這個(gè)事情不就省去了么。

interface Person {
  firstName: string;
  lastName: string;
}

function greeter(person: Person) {
  return "Hello, " + person.firstName + " " + person.lastName;
}

// Jasmine spec:
describe("greeter", function() {
  it("returns greeting", function() {
    expect(greeter({ firstName: "James", lastName: "Hetfield" })).toEqual(
      "Hello, James Hetfield"
    );
  });
});

上面的代碼更加簡(jiǎn)潔粥脚,甚至連測(cè)試也只需要考慮代碼的邏輯而不是數(shù)據(jù)的正確性窃肠。

TypeScript 有強(qiáng)大的類型系統(tǒng)來(lái)做類型推斷。你并不需要像在 C# 或則 Java 中那樣阿逃,顯示的列出數(shù)據(jù)的類型铭拧。下面是一個(gè)例子:

let user = { firstName: "James", lastName: "Hetfield" };
console.log(greeter(user));

上面的代碼可以成功編譯。請(qǐng)注意我們并沒(méi)有聲明 user 是 Person 類型的恃锉。

TypeScript 編譯器并不會(huì)強(qiáng)制你必須在所有地方都聲明類型,你可以在正確性和效率上自己做一個(gè)權(quán)衡呕臂。你甚至可以在項(xiàng)目不同的區(qū)域自定義類型的嚴(yán)格程度破托。這樣的靈活性超出了以前所有的開(kāi)發(fā)語(yǔ)言。

4. TypeScript 火不過(guò) 5 年

沒(méi)有人可以確保哪種語(yǔ)言歧蒋、工具或者框架一定可以持續(xù)活躍土砂,特別是在前端這一領(lǐng)域。一個(gè)StackOverflow 博客的作者這樣寫道:

在 JavaScript 框架的使用有兩個(gè)明顯的階段谜洽。因?yàn)榭蚣艿牧餍惺紫扔幸粋€(gè)快速的上升期萝映,然后當(dāng)開(kāi)發(fā)者接觸到其它新的技術(shù)后,慢慢的平穩(wěn)的下降阐虚。整個(gè)周期也就幾年的時(shí)間序臂。

你本身處于一個(gè)快速迭代的行業(yè),而你開(kāi)發(fā)的項(xiàng)目可以從某些特定的技術(shù)中受益实束。盡管 1奥秆、2 年后,你已經(jīng)切換到其它技術(shù)咸灿,但是你當(dāng)時(shí)學(xué)到的經(jīng)驗(yàn)依然值得构订。

5. TypeScript 沒(méi)有社區(qū)驅(qū)動(dòng)

TypeScript 由微軟在 2012 年發(fā)布,考慮到公司的形象以及其開(kāi)發(fā)平臺(tái)避矢,很容易產(chǎn)生“只不過(guò)是給.Net 開(kāi)發(fā)者打造的一個(gè) JavaScript 開(kāi)發(fā)玩具而已”的想法悼瘾。特別是當(dāng)時(shí)只有 Visual Studio 對(duì) TypeScript 有足夠的支持。事實(shí)上审胸,TypeScript 的源代碼最開(kāi)始是發(fā)布在CodePlex上亥宿,一個(gè)微軟自己的 GitHub。

不過(guò)歹嘹,現(xiàn)已不復(fù)當(dāng)年箩绍,TypeScript 身后的開(kāi)發(fā)團(tuán)隊(duì)意識(shí)到為了讓語(yǔ)言被廣泛接受,他們需要深入前端開(kāi)發(fā)社區(qū)尺上,為開(kāi)發(fā)者提供高質(zhì)量的開(kāi)發(fā)工具并且接受反饋不斷改進(jìn)材蛛。他們不僅僅是把代碼公開(kāi)然后默默開(kāi)發(fā)圆到,而是擁抱了一個(gè)開(kāi)放式開(kāi)發(fā)的方式。

在 2014 年卑吭,TypeScript 的源代碼移到了GitHub托管芽淡。而且整個(gè)開(kāi)發(fā)都在 GitHub 上公開(kāi)透明。他們同時(shí)接受外部提交貢獻(xiàn)豆赏,包括記錄 bug挣菲,提出建議以及提交 pull request。所有的 issue 會(huì)定期更新掷邦,幾天之內(nèi)就會(huì)有回應(yīng)白胀。核心團(tuán)隊(duì)發(fā)布了語(yǔ)言的設(shè)計(jì)理念用來(lái)指導(dǎo)團(tuán)隊(duì)不偏離目標(biāo)并積極吸收社區(qū)的建議。他們有一個(gè)保持更新的roadmap(基本上每?jī)蓚€(gè)月發(fā)布一次更新)抚岗,并記錄重大的更新或杠。

在我寫這篇文章的時(shí)候,所有主流的跨平臺(tái) IDE 或則編輯器像 Eclipse宣蔚、Webstorm向抢、Emacs、Vim胚委、Sublime挟鸠、Atom 和 VS Code 都對(duì) TypeScript 有著很好的支持,要么是內(nèi)置的亩冬,要么通過(guò)插件艘希。為了和現(xiàn)有的庫(kù)和框架交互,核心團(tuán)隊(duì)花了很多時(shí)間來(lái)創(chuàng)建類型定義文件鉴未。另一個(gè)值得一提的是編譯器 API 的文檔非常完善枢冤,可以很好地構(gòu)建第三方工具。TypeScript 的開(kāi)發(fā)者團(tuán)隊(duì)也鼓勵(lì)開(kāi)發(fā)者在StackOverflow上提出技術(shù)問(wèn)題铜秆。

6. 切換成本過(guò)高

為了充分發(fā)揮 TypeScript 的優(yōu)勢(shì)淹真,你需要花費(fèi)不少時(shí)間來(lái)聲明類型并修復(fù)編譯錯(cuò)誤,這會(huì)很繁瑣连茧。TypeScript 的創(chuàng)建者們有考慮到原有 JavaScript 項(xiàng)目切換的問(wèn)題核蘸,提供了相應(yīng)的方案。

根據(jù)官方的遷移指導(dǎo)啸驯,你可以直接運(yùn)行 TypeScript 的編譯器客扎。編譯器會(huì)拋出一些低層級(jí)的 bug,比如沒(méi)有 return 語(yǔ)句罚斗,代碼塊中有永遠(yuǎn)不會(huì)執(zhí)行的代碼徙鱼。然后,你可以將.js 文件重命名為.ts 文件,然后再處理編譯結(jié)果袱吆。編譯器默認(rèn)的選項(xiàng)沒(méi)有特別嚴(yán)格厌衙,你可以開(kāi)啟更加嚴(yán)格的驗(yàn)證。整個(gè)遷移有一個(gè)底線:整個(gè)過(guò)程是相當(dāng)平滑的绞绒,它不會(huì)使開(kāi)發(fā)中斷婶希。你可以選擇慢慢將一個(gè)項(xiàng)目切換到 TypeScript,或則來(lái)個(gè)快速的切換(參考:3 天搞定 60 萬(wàn)行代碼的遷移)蓬衡。社區(qū)還有一個(gè)叫做TypeWiz的項(xiàng)目可以自動(dòng)給代碼添加類型信息喻杈。

7. 但是我使用的庫(kù)都是基于 JavaScript

為了和現(xiàn)有的 JavaScript 模塊無(wú)縫對(duì)接,TypeScript 支持類型聲明文件狰晚。舉個(gè)例子筒饰,如果你使用的庫(kù)中導(dǎo)出了一個(gè) camelize 的函數(shù),你可以定義一個(gè)類型聲明文件并給出如下的定義:

declare function camelize(s: string): string;

當(dāng)你導(dǎo)入類型聲明文件后家肯,TypeScript 會(huì)正確獲取函數(shù)對(duì)應(yīng)的類型龄砰。

TypeScript 同時(shí)也發(fā)布了DefinitelyTyped,這個(gè) repository 包含了所有流行的庫(kù)的類型定義文件讨衣。在我寫這篇文章的時(shí)間點(diǎn),DefinitelyTyped 已經(jīng)包含了超過(guò) 5000 個(gè) JavaScript 包的類型定義式镐。使用方法非常簡(jiǎn)單:

npm install --save-dev @types/jasmine

類型文件會(huì)自動(dòng)被編譯器包含反镇,并且在編輯器中也會(huì)有對(duì)應(yīng)的代碼提示。幾乎所有或則大多數(shù)你使用的包都已經(jīng)有對(duì)應(yīng)的類型定義文件了娘汞,要么自身有相應(yīng)的類型定義文件歹茶,要么在 DefinitelyTyped 可以找到,你只需要下載安裝就好你弦。Slack 的開(kāi)發(fā)團(tuán)隊(duì)分享了他們的經(jīng)驗(yàn)

考慮到代碼維護(hù)惊豺,我們真的很感謝 TypeScript 強(qiáng)大的生態(tài)系統(tǒng)。我們是 React 和 Node/npm 的重度用戶禽作,第三方庫(kù)也有對(duì)應(yīng)的類型文件極大方便了開(kāi)發(fā)尸昧。很多我們導(dǎo)入的庫(kù)已經(jīng)和 TypeScript 兼容。如果沒(méi)有旷偿,那么也可以在 DefinitelyTyped 找到烹俗。比如,React 并沒(méi)有自帶類型定義萍程,你可以通過(guò)npm install @types/react來(lái)安裝幢妄,無(wú)需其他額外操作。

結(jié)論

使用靜態(tài)類型檢車可以幫助你消除很多 bug茫负,對(duì)于一個(gè)基于 Node/JavaScript 的項(xiàng)目蕉鸳,TypeScript 是你最好的選擇。對(duì)于一個(gè)相對(duì)小或則試驗(yàn)性的項(xiàng)目忍法,也許沒(méi)有必要潮尝。但是榕吼,一個(gè)大型的項(xiàng)目,TypeScript 絕對(duì)值得你嘗試衍锚。它帶來(lái)的好處遠(yuǎn)遠(yuǎn)大于它帶來(lái)的復(fù)雜度友题。一些大型的公司都開(kāi)始使用也是最好的證明,比如 Google戴质、Slack度宦、Asana、Ember 等等告匠。希望這篇文章給你啟發(fā)戈抄,讓你重新燃起對(duì) TypeScript 嘗試的欲望。

關(guān)于Fundebug

Fundebug專注于JavaScript后专、微信小程序划鸽、微信小游戲、支付寶小程序戚哎、React Native裸诽、Node.js和Java實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線型凳,F(xiàn)undebug累計(jì)處理了9億+錯(cuò)誤事件丈冬,得到了Google、360甘畅、金山軟件埂蕊、百姓網(wǎng)等眾多知名用戶的認(rèn)可。歡迎免費(fèi)試用疏唾!

版權(quán)聲明

轉(zhuǎn)載時(shí)請(qǐng)注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/12/26/7-bad-execuses-for-not-using-ts/

你可能感興趣的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末槐脏,一起剝皮案震驚了整個(gè)濱河市喉童,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌准给,老刑警劉巖泄朴,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異露氮,居然都是意外死亡祖灰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門畔规,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)局扶,“玉大人,你說(shuō)我怎么就攤上這事∪瑁” “怎么了畜埋?”我有些...
    開(kāi)封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)畴蒲。 經(jīng)常有香客問(wèn)我悠鞍,道長(zhǎng),這世上最難降的妖魔是什么模燥? 我笑而不...
    開(kāi)封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任咖祭,我火速辦了婚禮,結(jié)果婚禮上蔫骂,老公的妹妹穿的比我還像新娘么翰。我一直安慰自己,他們只是感情好辽旋,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布浩嫌。 她就那樣靜靜地躺著,像睡著了一般补胚。 火紅的嫁衣襯著肌膚如雪码耐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天溶其,我揣著相機(jī)與錄音伐坏,去河邊找鬼。 笑死握联,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的每瞒。 我是一名探鬼主播金闽,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剿骨!你這毒婦竟也來(lái)了代芜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浓利,失蹤者是張志新(化名)和其女友劉穎挤庇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贷掖,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫡秕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苹威。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昆咽。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掷酗,到底是詐尸還是另有隱情调违,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布泻轰,位于F島的核電站技肩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浮声。R本人自食惡果不足惜虚婿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阿蝶。 院中可真熱鬧雳锋,春花似錦、人聲如沸羡洁。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筑煮。三九已至辛蚊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間真仲,已是汗流浹背袋马。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秸应,地道東北人虑凛。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像软啼,于是被迫代替她去往敵國(guó)和親桑谍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361