一。背景
2010 – マイクロソフトチームが開発を開始
2012 – 最初の公開バージョンリリース(TypeScript 0.8)
2013 – TypeScript 0.9 リリース、ジェネリックをサポート
2014 – TypeScript 1.0 リリース、Visual Studio 2013 がデフォルトで TypeScript をサポート。同時に、ソースコードを CodePlex から Github に移行
2017 – TypeScript 2.1 リリース
2018 – TypeScript 3.2 リリース
TypeScript は当初マイクロソフトの内部プロジェクトで、Strada と呼ばれ、大規模 JS プロジェクト(当時の内部要件は Bing Maps、Office Web Apps、さらには Windows 8 apps)の信頼性と保守性を向上させることに専念していました。2010 年に開発を開始し、2012 年 10 月に最初のオープンソースバージョンをリリースし、現在まで継続的にイテレーションしています
二。目標
Application scale JavaScript development is hard.
JavaScript は当初スクリプト言語として設計され、大規模アプリケーションを構築するために必要ないくつかの基礎特性が欠けていました。例えば:
-
静的タイプ
-
構造化メカニズム(クラス、モジュール、インターフェースなど)
タイプ上の欠陥により、多くのエラーはランタイムになるまで暴露されません。一方、静的タイプの欠如は JS 編集体験が悪い主な原因でもあります。インテリセンス、自動補完などの現代的な編集体験は Visual Studio から始まりました:
-
タイプ推論に基づくインテリセンス
-
JSDoc に基づくインテリセンス
-
TypeScript 宣言ファイルに基づくインテリセンス
(JavaScript IntelliSense より抜粋)
Application scale JavaScript development is hard, TypeScript makes it easier.
TypeScript はソースコードのトランスパイルを通じてこれらの欠陥を埋め、JavaScript に OOP サポート(Class、Interface など)とオプションの静的タイプシステムを追加し、ES5 時代(2010 年)に大規模 JavaScript アプリケーションを開発する基盤を築くことを期待しています
さらに、TypeScript は JavaScript にもう 1 つの重要なものをもたらしました。d.ts 宣言ファイルです:
Working with existing JavaScript libraries, declaration file can be written and maintained separately.
独立した宣言ファイルを通じて既存の JavaScript ライブラリにも TypeScript のタイプ優位性を持たせることができ、JavaScript 編集体験を向上させる面で大きな一歩を踏み出しました
三。位置付け
TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.
3 つの重要な点があります:
-
typed:タイプ化された。JS に(オプションの)静的タイプを補充
-
superset of JavaScript:スーパーセット。JS と互換性があり、混用をサポートし、既存の JavaScript ライブラリは直接使用可能
-
compiles to plain JavaScript:ネイティブ JS にコンパイル。JavaScript から始まり、JavaScript で終わる
具体的には:
-
JavaScript から始まる:スーパーセットはすべての JavaScript コードが TypeScript であることを意味し、構文セマンティクスは JavaScript と一致し、コピーペーストで開始できます
-
オプションの静的タイプ、クラスとモジュールを提供:タイプは JavaScript 開発が効率的な開発ツールとプラクティス(静的チェックやコードリファクタリングなど)を使用できるようにするだけでなく、ランタイムのパフォーマンス損失をもたらしません(静的タイプはコンパイル時のみ存在)
-
JavaScript で終わる:TypeScript は本格的なネイティブ JavaScript をコンパイル生成するため、最先端の JavaScript 特性をサポートし、ES3+ をサポートする任意のホスト環境で実行できます
TypeScript は JavaScript の構文糖 と考えることができます:
TypeScript is a syntactic sugar for JavaScript. TypeScript syntax is a superset of ECMAScript 2015 (ES2015) syntax. Every JavaScript program is also a TypeScript program.
(Introduction | TypeScript Language Specification より抜粋)
タイプパッチのように、JavaScript 世界と完璧に融合できることこそが TypeScript の生命力の源です:
Starts and ends with JavaScript, and optional static types, classes, modules.
さらに、この点は TypeScript が公開リリース(2012 年末)されてから現在(2019 年初)まで変わっていません
四。設計原則
追求:
-
静的にエラーが発生する可能性のある部分を識別
-
大規模コードに構造化メカニズムを提供
-
コンパイル産物にランタイムオーバーヘッドを追加しない
-
クリーンで本格的で読みやすい JavaScript コードを出力
-
組み合わせ可能で推論しやすい(easy to reason about)言語を実装
-
常に ES 仕様と一致を維持
-
すべての JavaScript コードのランタイム動作を保持
-
式レベルの構文特性を追加しない
-
一貫した、完全に消去可能な構造化タイプシステム
-
クロスプラットフォーム開発ツールになる
-
TypeScript 1.0 から重大な破壊的変更を導入しない
拒否:
-
既存言語の設計を完全に模倣する。JavaScript の動作と開発者の意図を言語設計ガイドとするべき
-
プログラムのランタイムパフォーマンスを最適化する。ネイティブ JavaScript コードを忠実に出力し、意図的に最適化しない
-
完全なまたは「証明可能に正しい」タイプシステム。正確性と生産性の間でバランスを取るべき
-
エンドツーエンドの(閉じた)ビルドパイプラインを提供する。システムを拡張可能にし、コンパイラをより複雑なビルドワークフローに適用可能にするべき
-
ランタイムタイプ情報を追加または依存する。またはタイプシステムの結果に基づいて異なるコードを生成する。ランタイム情報(run-time metadata)に依存しないプログラミングパターンを奨励すべき
-
追加のランタイム機能またはライブラリを提供する。TypeScript を使用して既存のライブラリを記述すべき
-
ユーザーを驚かせる可能性のある動作を導入する。他の一般的な言語が採用するパターンを適切に考慮すべき
五。特性
タイプシステム
-
JavaScript タイプの形式化:JavaScript タイプ動的システムの静的表現
-
タイプ推論と構造化タイプを提供:実際にはすべてにタイプを注釈する必要はありません(タイプ推論が一部を解決できます)
-
既存の JavaScript ライブラリと連携して使用可能:宣言ファイルは独立して作成・保守できます
-
証明可能なタイプセーフ(provably type safe)ではない:タイプは意図を反映するだけで、保証を提供しません
最も重要なのは、静的タイプはコンパイル時のみ存在することです:
In the JavaScript output, all type annotations have been erased.
例えば:
// TypeScript
function f(s: string) {
return s;
}
// コンパイルで得られた JavaScript、タイプ注釈はすべて消去
function f(s) {
return s;
}
さらに、TypeScript は静的タイプシステムを提供し、コンパイル時に厳密にチェックしますが、[Haskell タイプシステム](/articles/タイプ-haskell ノート 3/) のように証明可能で推論可能ではありません。したがって、TypeScript タイプシステムはより多くは JavaScript の静的タイプパッチとして、コメントのように「意図」を体现するだけで、安全を保証しません
さらにコンパイルエラーはコード生成をブロックしません。タイプチェックエラーはここに問題が存在する可能性があることを警告するだけです:
You can use TypeScript even if there are errors in your code. But in this case, TypeScript is warning that your code will likely not run as expected.
クラスとモジュール
-
拡張可能なアプリケーション構造化メカニズム:クラス、モジュール、インターフェースはコンポーネント間の明確な関係を定義することをサポート
-
最新標準に準拠:クラス、モジュール、アロー関数構文はすべて ES6 標準と一致
-
業界主流のモジュールシステムもサポート:CommonJS や AMD モジュールなど
注意、モジュールの構文ルールは ES 標準と一致しますが、ロードメカニズムには差異があります。詳細は Module Resolution を参照
六。エコシステム
-
(オープンソース)コンパイラ:typescript
-
ツール:IDE サポート(VS、VSCode、Sublime、WebStorm、Vim など)、Playground
-
タイプライブラリ:DefinitelyTyped
-
サンプルプロジェクト:Samples、Community Samples
-
ケース:GitHub TypeScript プロジェクト(Angular、ant-design などを含む)
参考資料
-
Anders Hejlsberg: Introducing TypeScript:TypeScript 公開リリース講演
-
TypeScript:上記講演対応の PPT
コメントはまだありません