7個(gè)不使用TypeScript的理由,你認(rèn)同嗎?
TypeScript很受大眾喜愛(ài)。因?yàn)樗?ldquo;解決”了JS的許多問(wèn)題,是JS的“超集”。它不僅能輕松找出代碼錯(cuò)誤,還能使其易于閱讀。
對(duì),沒(méi)錯(cuò),使用TypeScript的理由太多了。
反其道而行之,今天小芯就要說(shuō)7個(gè)不使用TypeScript的理由。
1. 它不能解決問(wèn)題
據(jù)說(shuō)TypeScript可以解決JavaScript的問(wèn)題,但事實(shí)并非如此。動(dòng)態(tài)類(lèi)型在JavaScript中從來(lái)都不是問(wèn)題,但是許多其他問(wèn)題,例如NaN===NaN為false、分號(hào)為可選或非可選、換行符將對(duì)象定義更改為作用域、語(yǔ)法糖代替OOP等,確實(shí)是問(wèn)題。TypeScript并沒(méi)有解決這些問(wèn)題,但是引入了另一個(gè)標(biāo)準(zhǔn),進(jìn)一步分化了JS社區(qū)。
即使假設(shè)JS中缺少類(lèi)型是一個(gè)問(wèn)題,TS也不能解決這個(gè)問(wèn)題。你知道什么語(yǔ)言可以解決嗎?Java、C、C#等編譯語(yǔ)言可以。它們可以在編譯和運(yùn)行時(shí)安全地保證強(qiáng)類(lèi)型。翻譯語(yǔ)言就是不能做到這一點(diǎn)。
2. 雖然開(kāi)源,但很局限
使用TypeScript的許多原因表明它是開(kāi)源的。沒(méi)錯(cuò),TS編譯器是在MIT許可下發(fā)布的。但它仍由微軟(Microsoft)控制,微軟是一家壟斷性的大公司,其開(kāi)源技術(shù)的進(jìn)步不過(guò)是一種營(yíng)銷(xiāo)手段。不要把開(kāi)源和民主混為一談:微軟仍然可以用TS做任何你想做的事情,你只是來(lái)看看。另一方面,JS由一個(gè)國(guó)際委員會(huì)管理,未經(jīng)共同體批準(zhǔn),任何事情都不會(huì)改變。
來(lái)源:Pexels
3. 危險(xiǎn)
所以,如果TypeScript添加類(lèi)型定義并在編譯時(shí)進(jìn)行檢查,會(huì)有什么風(fēng)險(xiǎn)呢?以及IDE集成將警告你任何類(lèi)型不匹配?
正因?yàn)槿绱耍琓ypeScript只在編譯時(shí)檢查類(lèi)型,并且只檢查可用的類(lèi)型。任何網(wǎng)絡(luò)調(diào)用、系統(tǒng)庫(kù)、特定于平臺(tái)的API和非類(lèi)型化的第三方庫(kù)都無(wú)法與TypeScript通信。當(dāng)你習(xí)慣于檢查類(lèi)型,而不必完全理解代碼和平臺(tái)時(shí),就會(huì)出現(xiàn)錯(cuò)誤和bug。
使用JS,對(duì)類(lèi)型沒(méi)有任何假設(shè),并且檢查變量的具體值,以確保它符合期望。或者,如果你不關(guān)心它在這種特殊情況下的類(lèi)型,就無(wú)需檢查。在TS中,你依賴編譯器執(zhí)行此操作,但它只能檢查這么多。你可以把這兩種方法結(jié)合起來(lái),但那又有什么意義呢?如果花時(shí)間編寫(xiě)定義,然后再編寫(xiě)代碼以確保運(yùn)行期間維護(hù)這些定義,那么為什么首先要選用它們呢?
4. 凌亂
另一個(gè)悖論是:本應(yīng)為代碼庫(kù)增加清晰性和可讀性的語(yǔ)言反而令其晦澀難懂。為了展示我的意思,請(qǐng)看以下在有效開(kāi)源庫(kù)中找到的一些示例:
- // TODO: dothismoreelegantly
- ;((currentReducerasunknown) asReducer<
- NewState,
- NewActions
- >) =nextReducer
viewrawcreateStore.ts hostedwith❤by GitHub
這一行來(lái)自Redux庫(kù),這4行所做的就是將nextReducer分配給currentReducer。
- // HACK: SinceTypeScriptinheritsstaticpropertiestoo, wehaveto
- // fightagainstTypeScriptheresoSubjectcanhaveadifferentstaticcreatesignature
- /**
- * CreatesanewcoldObservablebycallingtheObservableconstructor
- * @statictrue
- * @ownerObservable
- * @methodcreate
- * @param {Function} subscribe? thesubscriberfunctiontobepassedtotheObservableconstructor
- * @return {Observable} anewcoldobservable
- * @nocollapse
- * @deprecatedusenewObservable() instead
- */
- staticcreate: Function= <T>(subscribe?: (subscriber: Subscriber<T>) =>TeardownLogic) => {
- returnnewObservable<T>(subscribe);
- }
viewrawObservable.ts hostedwith❤by GitHub
下一個(gè)例子來(lái)自RxJS庫(kù)。我不知道你的情況,但如果我要和一個(gè)應(yīng)該幫助我的工具戰(zhàn)斗,我認(rèn)為這不是一個(gè)好工具。
5. 不是超集,而是子集
TypeScript是編譯成JavaScript的語(yǔ)言,根據(jù)定義它不能是超集。它限制了使用JavaScript所能做的事情,并且在提供虛假的內(nèi)心平靜的同時(shí)掩蓋了JavaScript強(qiáng)大的一面。如果你真的想成為一個(gè)偉大的開(kāi)發(fā)者,不要沉溺于一個(gè)安慰的謊言,試著去理解JavaScript的真正力量和它的靈活性。
6. 有更多的特點(diǎn)…
這個(gè)原因已經(jīng)不再成立。誠(chéng)然,當(dāng)TS在2012年首次引入時(shí),它具有類(lèi)等特性,但在JS中仍然不可用。但是JS從那時(shí)起已經(jīng)走了很長(zhǎng)的路,現(xiàn)在TS正在努力跟上。如果JS中缺少任何東西,那么就需要一個(gè)babel插件來(lái)完成。
7. 大公司會(huì)選擇它…
我不敢相信有人會(huì)認(rèn)為這是一個(gè)原因。大公司也使用遺留的代碼庫(kù),進(jìn)行稅務(wù)欺詐,歧視婦女。為什么他們突然使用TypeScript是一個(gè)很好的例子呢?
來(lái)源:Pexels
TypeScript的確有許多好用之處,但不是什么情況都適用,小芯也不是什么“杠精”,只是希望大家可以客觀看待~