如何評價 TypeScript 1.7?

Announcing TypeScript 1.7


async / await 終於來了,最近在用 typescript + express 寫node,用了async/await 後的代碼大概長這樣:

不過像 wy小宇哥undoZen 說的, babel 支持直接編譯 async/ await 到ES5(雖然要加polyfill)。但是我覺得Typescript 打一開始就不是跟babel 競爭的,雖然可能在某些地方有一些業務重合。Typescript 的優勢難道不是在於類型 + 介面的定義對 Javascript 項目工程化的幫助嗎?


沒有質變。

async/await會編譯成yield/generator加一個__awaiter函數,這個__awaiter函數和co原理是一樣的,這種方式在目前支持yield/generator的JS環境下是最合適的async/await實現了,如果以ES5為編譯目標,生成的代碼量會巨大,而且對人完全是不可讀的。所以我個人不傾向於在ES5環境當中使用async/await。

編譯目標設置為ES6的時候,可以使用ES6的module/import語法,對於以export default的模塊,個人認為用起來會顯得不太方便,並且還有一個小小的bug,這裡就先不詳細描述了。不論怎樣,擁抱ES6肯定是趨勢。

一個不知道是不是1.7才引入的問題:以ES6為編譯目標時,某些d.ts會用不了,比如bluebird,因為TS的lib.es6.d.ts里定義了Promise,而bluebird.d.ts也定義了,於是重複定義。當然這種問題可以等第三方庫的d.ts更新,或者自己修改一下兼容,不過我目前用的是很猥瑣的辦法就是自己改了一個lib.es6.d.ts,把裡面Promise的定義全刪了- -"。

npm install typescript@next的話,可以嘗鮮體驗到1.8,不過還是有不少BUG……


最近有在跟進翻譯 TypeScript 項目 wiki 里的 what"s new, 有需要的同學可以查看 TypeScript 新增特性一覽.

1.7 相對而言並沒有增加很多新的東西, async/await 其實 1.6 的時候就已經有了, 只是之前需要添加選項. 比較重要, 或者比較有意義的更新主要有兩個.

第一個是編譯目標為 ES6 時也可以指定模塊方案, 然而這只是個過渡, 未來很多功能更夠拆分開來配置是否輸出 polyfill, 離 (主要使用 TypeScript 的開發者) 告別 Babel 也就越近了.

第二個是 this 類型, 對於喜歡鏈式調用的同學來說是一大福音, 也為其他場景提供了更多的靈活性.

除開這兩個, 對對象/數組的字面量解構推導也更方便易用, 可以少一些冗餘.

總體來說, 1.7 帶來的特性並不是很多, 其實在 1.6 發布後不久, 1.8 就已經和 1.7 在同時進行開發.

--

另外至於 TypeScript 尚未支持 async/await 編譯到 ES5, 主要原因有兩點:

1. 會影響編譯速度.

2. 生成的代碼幾乎不可讀, 難以調試.


都說 TypeScript 是 Babel 的競爭對手,但是這一次,如果你想在 TypeScript 里用 async/await,你得用 TypeScript 編譯成 ES6,然後再用 Babel 編譯成 ES5


無論是什葉派的typescript 還是遜尼派的coffeescript 都無法阻止原教旨的es崛起


推薦閱讀:

npm、bower、jamjs 等包管理器,哪個比較好用?
js 數組賦值問題 :值傳遞還是引用?
在自學前端,但是沒有什麼實踐的資源,大家來推薦一下論壇或者別的可供練習的資源吧?
JS立即執行如何使用?還是說圓括弧本身是用來改變JS的執行上下文環境?
js 中,不使用數組,不使用對象,可以 return 多組值嗎?

TAG:JavaScript | TypeScript |