flow.js/typescript 這類定義參數類型的意義何在?

動態語言的特點之一就是變數不需要提前定義。但flow.js/typescript都在做這件事情,他們背後是facebook和微軟,相信做這件事肯定是有原因的。但是什麼原因?不知道哪位能解釋一下?


謝邀.

其實大家基本都有答到了, 而且打開 TypeScript 官網焦點圖裡第一張的標題就是 Scalable. 最近用 TypeScript 寫了一個客戶端編譯為 JS 大概一萬行的手機 web 應用. 在這個數量級上, TypeScript 帶來的好處已經是顯而易見的了, 我再把其他大大的答案匯總一下.

1. 靜態類型檢查

靜態類型檢查可以避免很多不必要的錯誤, 不用在調試的時候才發現問題 (其實有的時候根本調試不出問題, 只是默默地把坑挖了, 說不定埋的就是個炸彈, 之前用 TypeScript 重寫應用的伺服器端程序, 寫完之後就發現了不少暫時沒有影響到運行的嚴重問題).

2. IDE 智能提示

在 TypeScript 這一類語言之前, JavaScript 的智能提示基本完全依賴 IDE 提供的猜測 (在猜測的質量上, Visual Studio 和 brackets 是我見過的最好的). 局限性就是, 這種猜測可能並不正確, 並且也缺乏更多的輔助信息, 所以要正確使用一個類庫, 得不斷地在文檔和 IDE 之間切換, 影響心情和效率. 而 TypeScript 不僅自己寫的類庫有豐富的類型信息, 也可以對其他純 JS 項目進行類型標註 (DefinitelyTyped), 便於使用者直接在 IDE 中瀏覽 API, 效率大增.

而對於自己的或者團隊的代碼, 好處也很明顯. 團隊的代碼自己不一定能把各種介面記得滾瓜爛熟, 自己的代碼如果規模大了也很難記全, 這個時候再去翻源文件,,, 嘖嘖嘖.

3. 代碼重構

且不說我這種經常糾結變數名的會時不時看某個變數名不順眼, 改之的情況. 有時候的確需要修改一些變數/屬性/方法名, 牽涉到屬性和方法的時候, 很多改動是跨文件的, 不像普通變數可以簡單定位 scope, 屬性方法名的重命名對於 JS 來說異常痛苦, 一方面是修改本身就不方便, 另一方面是改了還不確定該改的是不是改了, 不該改的是不是也改了. 而 TypeScript 的靜態類型系統就可以較為完美的解決這個問題 (這個地方還牽涉到一些最佳實踐, 就暫不深入了).

4. 可讀性

對於閱讀代碼的人來講, 各種便利的類型一目了然, 更容易明白作者的意圖.

--

其實在 TypeScript 之前, 自己也寫了一個小庫 (VEJIS), 進行 JS 在運行時的類型檢查/增強, 實現了諸如增強的類, 函數重載, interface, delegate 等, 結合 Visual Studio 強大的智能感知和智能感知 API 還可以方便得注釋各種重載並且轉化為 signatures. 不過因為有了 TypeScript, 也就沒有太多存在得價值了.

之前也有同學問為毛要寫這麼個東西, 其實還是為了 Scalable. 就跟總有同學會問 "類在實際生產中使用多不多" 這種問題一樣, 只有等到你有了需求, 才能真正體會它們的價值.


出於engineering上的考慮,目的是改造js,在大規模的項目上達到更高的開發效率。可參考為什麼G家要擼一個go出來,水果家要擼一個swift出來

方法是儘可能提供pre runtime的類型檢查,防止類型錯誤、減少調試的工作量

可惜執行引擎還是純js,所以編譯器的所有類型信息在運行時都沒啥用了

另外ts的變數也可以不用提前定義,利用type inference可以推斷出來


typescript在運行時也是沒有類型的,編譯時的類型有幾個作用,一個是阻止程序員一不小心寫出傻逼代碼,另一個就是可以給IDE添加intellisense的時候提供很大的便利,最後就是寫起文檔很方便。


因為需要有一個工業級別的語言,js無法承載這麼大的載量,js模擬了半天才勉強面向對象,設計模式更是難以使用。一個工業級別的語言需要健壯性,按一定規範設計能約束使用的人,精準的智能提示和語法檢查更是不可或缺的。


知乎有句名言:動態類型一時爽,代碼重構火葬場。


  • IDE代碼提示,自動補全,讓你敲代碼的效率提高n個數量級。

  • 編譯時類型檢查減少運行時出錯,讓你debug輕鬆n個數量級。

  • 類型關係明確,大規模代碼可讀性增加n個數量級。


如果你要應對的問題只是一張簡單的web,JS之類的腳本語言確實輕鬆就能搞定,但如果你要寫的是一個web版的word,你可以只用js寫寫看,美到你想哭


能用程序做的用程序做 (類型推斷和檢查),不行的再用人腦


把原生 js 需要的大量註解(或者魔法),轉移到類型上,讓編譯器幫你檢查。


有一篇文章寫的還不錯 —— http://www.xiaomantou.net/#/article/56c5cdd91ad9073a1acf748e

需要類型檢查的原因:

1. 為了更清晰的文檔說明

2. 讓編譯器可以自動補全,快速跳轉,這一點在大型的應用程序中還是很必要的

3. 為程序員提供一個概念上的框架


降低記憶負擔


要是有幾十萬行的js代碼,要重構其中一部分方法,全部靠人肉檢查會瘋的。沒有編譯期檢查,項目越大越難維護。很明顯他們的野心遠不止在網頁上搞搞,node越來越流行,metro應用不也可以用js編寫么。


推薦閱讀:

facebook immutable.js 意義何在,使用場景?
如果寫一個靜態HTML頁面,直接寫HTML代碼和用JS動態生成代碼,哪種方式要好點?為什麼?
JS 引擎如何實現 for (let i;...) { } 寫法中每次循環綁定不同的循環變數 i?
gulp是一個前端工作流管理工具,具體做什麼的?
如何看待『真阿當』關於前端核心壁壘的描述?

TAG:JavaScript | TypeScript |