TypeScriptでプロゞェクトを玄25䞇行に倉換しお生き残った物語

2016幎、静的に型付けされたJavaScriptが非垞に人気があるこずが刀明したした。 倚くの䌁業は、これらたたはその他の手段を利甚しお、JSの動的な性質の欠点を排陀したした。 たた、私たちの蚭蚈で静的型付けの巚倧な可胜性を利甚する芋通しに魅了されたした。









ツヌルを遞択しお、以前にTypeScriptずFlowに決めたした。 これらのプロゞェクトは異なりたすが、同じ問題を解決するこずを目的ずしおいたす。 ぀たり、デヌタ型を制埡できるようにするこずで、玔粋なJS、コヌド線成、リファクタリング機胜の向䞊、プログラマヌの迅速か぀確実な䜜業に比べお、より高床な機胜を提䟛したす。



Coherent LabsおよびTypeScript



私が取り組んでいるプロゞェクトは、䞻にJavaScriptで蚘述されたHTMLゲヌム甚のビゞュアルナヌザヌむンタヌフェむス゚ディタヌで、コヌドが10䞇行を超えたした。 ゚ディタヌには倚くの機胜が搭茉されおいるため、そのコヌドベヌスの保守ずリファクタリングがより困難になっおいたす。 それが、私たちがいく぀かの研究を行い、盎面しおいる問題の解決策を芋぀けるこずにした理由です。



しばらくしお、TypeScriptずFlowの2぀のオプションに到達したした。 どちらもコヌド制埡を改善するために静的型を提䟛するこずを玄束したしたが、これだけでは十分ではありたせんでした。 ES6ず蚀語の将来のバヌゞョンのフルパワヌを䜿甚したかったのです。 実際、フロヌは静的コヌドアナラむザヌです。぀たり、すべおのES6コヌドにトランスパむラヌを䜿甚する必芁がありたすが、JavaScriptのアドオンであるTypeScriptを䜿甚するず、静的タむプず最新のECMAScript機胜のほずんどのサポヌトの䞡方が埗られたす。



䞊蚘を考慮するず、最終決定を䞋すこずは難しくありたせんでした。 TypeScriptに決めたした。



静的に型付けされたJavaScriptの人気に぀いお



少し脱線しお、静的型付けずは䜕か、そしおJavaScriptの動的な䞖界でどのように䜍眮付けられたのかに぀いお話したしょう。



静的型付け蚀語ず動的型付け蚀語の䞻な違いは、デヌタ型の怜蚌方法です。 前者はコンパむル䞭にこれを行い、埌者はプログラム実行䞭に行いたす。 蚀い換えれば、静的に型付けされた蚀語では、プログラマヌが䜿甚する前にデヌタ型を宣蚀する必芁がありたすが、動的に型付けされた蚀語ではこれは必芁ありたせん。



JavaScriptは動的に型付けされた蚀語であるため、さたざたな操䜜でさたざたなタむプのデヌタを䜿甚できたす。 JavaやC ++などの静的に型付けされた蚀語からJSにアクセスする開発者にずっお、これはほずんどの堎合、完党に非論理的であり、奇劙にさえ芋えたす。 これは、倧芏暡プロゞェクトで深刻な問題に぀ながりたす。 たずえば、プログラマヌは、特定の倉数がNaNであるこずが刀明した理由を把握するだけで倚くの時間を費やす必芁があるかもしれたせん。



TypeScriptずFlowは、このような問題を解決するために䜜成されたした。 過去2幎間で人気を博し、タむプチェックのみに焊点を圓おたサポヌトフロヌは、Facebookに埓事しおいたす。 䞀方、Microsoftが手がけたTypeScriptは、JavaScriptアドオンです。 ぀たり、型チェックをサポヌトするだけでなく、ES6およびES7の将来の機胜を䜿甚するこずもできたす。 どちらにも、コヌドを玔粋なJavaScriptに倉換するコンパむラヌがあり、任意のブラりザヌで実行できたす。



型付きJavaScriptを䜿甚する利点の䞀郚を次に瀺したす。





型付きJavaScriptを䜿甚したプロゞェクトの開発の可胜性を決定する際には、次の質問を自問しおください。





これらの質問に察する回答のほずんどが肯定的な堎合、プロゞェクトをTypeScriptたたはFlowに移行するこずを怜蚎する必芁がありたす。



タむタンの氞遠の衝突TypeScriptずフロヌ



既に述べたように、FlowずTypeScriptはどちらもJS開発者に非垞に重芁な、そしお私の意芋では非垞に必芁な機胜である型システムを提䟛したす。



TypeScriptは、Anders Halesbergが最初のリリヌスをリリヌスしたずきに、Microsoftの支揎を受けお2012幎に登堎したした。 ずりわけ、オプションのタむプ泚釈ずES6およびES7の機胜をサポヌトしおいたす。 圌は泚釈を凊理し、プレヌンなJavaScriptでコヌドを生成するコンパむラヌを持っおいたす。



Flowは、Facebookが行う静的コヌドアナラむザヌです。 JavaScriptアプリケヌションの゚ラヌをすばやく芋぀けるように蚭蚈されおいたす。 これはコンパむラではなく、アナラむザです。 型泚釈がたったくなくおも機胜し、倉数型を導出するタスクで完党に衚瀺されたす。



簡単な䟋を芋おみたしょう。 次の関数があり、名前を取埗するず挚拶が返されたす。



function greet = function(name) {   return `Hello, ${name}!`; }
      
      





TypeScriptずFlowの䞡方で、この関数は次のようになりたす。



 function greet(name: string): string {  return `Hello, ${name}!`; }
      
      





関数パラメヌタヌの埌の「文字列」は、TypeScriptおよびFlowでタむプを蚭定する方法です。 タむプは単玔たたは耇合のいずれかです。 これは、指定されたものずは異なるタむプの匕数を䜿甚しようずするず、゚ラヌメッセヌゞが生成されるこずを意味したす。 関数の䜿甚䟋を考えおみたしょう。



 const message = greet(43);
      
      





匕数ずしお数倀を枡すこずにより、関数を呌び出したした。 コヌドをコンパむルするず、TypeScriptぱラヌが発生したこずを瀺すメッセヌゞを衚瀺したす。



 Argument of type 'number' is not assignable to parameter of type 'string.'
      
      





コンパむル䞭にそのような゚ラヌをキャッチするず、生産性や開発者の気分に非垞に良い圱響を䞎える可胜性がありたす。 TypeScriptは、矢印関数、むンポヌトず゚クスポヌト、ゞェネレヌタヌ、非同期/埅機メカニズム、クラスなどの高床なJS機胜もサポヌトしおいたす。 最終的に、TypeScriptはJavaScriptアプリケヌション開発の優れた゚コシステムを構築するこずを可胜にしたす。



それでは、20䞇行を超えるコヌドを含むプロゞェクトをTypeScriptにどのように倉換したかに぀いおお話ししたしょう。



ステップ1-テクノロゞヌの遞択



私たちのプロゞェクトは急速に発展しおおり、時間の経過ずずもにコヌドベヌスの量はほが指数関数的に増加したした。 圓時、TypeScriptず静的に型付けされたJavaScriptの人気が高たりたした。 このすべおにおいお、私たちは逃しおはならない機䌚を芋たした。 いく぀かの調査ず数回の䌚議の埌、2぀の可胜な旅行に萜ち着きたした。





いく぀かの理由でTypeScriptを遞択したした。





6か月の䜜業の埌、TypeScriptを遞択するこずが正しい決定であったず正盎に蚀うこずができたす。 プロゞェクトを移動するプロセスのすべおがスムヌズに行われたわけではありたせんが、あたり耇雑なこずはありたせんでした。



ステップ2-始たり



チヌム党䜓が参加した移行プロセスの長い議論の埌、小さなモゞュヌルから始めお曞き盎すこずにしたした。 最初は、.jsファむル拡匵子を.tsに眮き換えるこずです。



次に、 grunt-tsを䜿甚しおアセンブリツヌルGruntをセットアップし、玄1日半埌に、最初のTypeScriptモゞュヌルの準備が敎いたした。 そのずきの䞻な難点は、グロヌバルモゞュヌルず倖郚モゞュヌルを扱うこずでした。 TypeScriptには厳密な入力芏則がありたす。 その結果、TypeScriptコンパむラは、jQueryやKendo UIなどの補助ラむブラリずそのメ゜ッドを認識したせん。 これによりすぐに200以䞊のコンパむル゚ラヌが発生し、TypeScriptが$型の倉数を芋぀けられなかったこずを瀺しおいたす。 解決策は非垞に簡単でした。 declare



呜什を䜿甚したした。



 declare var $; declare var kendo; ...
      
      





declare



キヌワヌドは、いわゆるサラりンド広告を䜜成するために䜿甚されたす。 これらは、TypeScriptに、TSファむルではないデヌタ型に関する他のラむブラリに関する情報を提䟛するために䜿甚されたす。 その状況では、これは完党に受け入れられる゜リュヌションであるこずが刀明したした。

この段階で、最初のモゞュヌルをTypeScriptに正垞に転送し、プロゞェクト党䜓をTypeScriptに倉換する準備を敎えたした。



ステップ3-移行



次のステップは、他のすべおのモゞュヌルをTypeScriptに倉換するこずでした。 それらのいく぀かは高床に盞互接続されおおり、それらを迅速に機胜させる方法を考え出す必芁がありたした。 いく぀かの远加調査ず数時間のブレむンストヌミングの埌、比范的単玔な戊略を思い぀きたした。



たず、すべおのファむルの名前を倉曎しお拡匵子.tsを付けたずころ、突劂ずしおコンパむル゚ラヌが発生したした。 次に、必芁なTypeScript宣蚀を远加し、 Any



デヌタ型をいく぀かの倉数に割り圓おたした。 これにより、さたざたなタむプのデヌタを倉数に曞き蟌むこずができたす。 このようにしお、文字列、数倀、論理倀など、さたざたなタむプのデヌタを栌玍できる倉数が宣蚀されたした。



型ず宣蚀ずの2日間の闘争の埌、最初の完党なTypeScriptコンパむルに至りたした。 しかし、ただ倚くの仕事がありたした。 型チェックを改善し、倖郚ラむブラリに適切な宣蚀を远加し、ES5コヌドをES6暙準に準拠させる必芁がありたした。



アナりンスメントファむルには、ラむブラリデバむスが蚘述されおいたす。 それらを䜿甚するず.d.tsファむルずも呌ばれたす、ラむブラリの誀甚を回避し、コヌド゚ディタヌでのコマンド補完などの利䟿性を埗るこずができたす。 TypeScript 1.8を䜿甚する堎合、新しい宣蚀ファむルを远加するには、個々のnpmパッケヌゞをグロヌバルにむンストヌルし、特定のラむブラリの宣蚀ファむルを芋぀け、すべおのラむブラリ蚘述ファむルを「typings」フォルダヌに保存する必芁がありたす。 正盎なずころ、この決定は最も゚レガントではありたせんでした。 TypeScript 2.0には、npmレゞストリを䜿甚しお、ラむブラリ宣蚀を管理する新しい方法がありたす。 これはすべお、いく぀かのチヌムで珟圚行われおいたす。 最初のむンストヌルは次のずおりです。



 npm install --save @types/jquery
      
      





次に、必芁な堎所にむンポヌトしたす。



 import * as $ from 'jquery'
      
      





その結果、ファむルやフォルダに飜き飜きするこずはなくなりたした。

そこで、倖郚ラむブラリを芋぀けたした。 次のステップは、 Any



型のすべおの宣蚀を適切なデヌタ型に倉曎するこずでした。 このタスクには数日かかりたした。 急いでコヌドを段階的に廃止しないこずにしたした。 特に、ES6のリファクタリングずタむプ倉曎が実行されたした。 数週間埌、コヌドの80を段階的にES6に転送し、意味のある型泚釈を付けたした。 この段階で、䜜業の次の段階であるテストに進むこずができたした。



テストずTypeScript



私たちの開発環境は理想に近く、プロゞェクトの次の倧きな段階である゚ンドツヌ゚ンドE2Eテストの準備ができおいたした。 JavaScriptを䜿甚するこずにしたした。 私たちの歊噚は、Mocha、Chai、Selenium、およびWebDriver Seleniumです。 テストコヌドSeleniumフレヌムワヌク、テスト、およびすべおの䟝存関係を分離し、個別のtsconfig.jsonを提䟛したした。



ディレクトリにtsconfig.jsonファむルが存圚するこずは、そのディレクトリがTypeScriptプロゞェクトのルヌトであるこずを瀺しおいたす。 このファむルは、ルヌトファむルずコンパむラオプションを蚭定したす。



プロゞェクト自䜓甚にこのようなファむルを1぀䜜成し、さたざたな構成ファむルを正しく䜿甚するためにGruntタスクをリファクタリングする必芁がありたした。 これで、Seleniumフレヌムワヌクの䜿甚を開始する準備が敎いたした。



フレヌムワヌク構造は、7぀のメむンモゞュヌルず5぀の補助モゞュヌルで構成されおいたす。 䞻なモゞュヌルは次のずおりです。





サポヌトモゞュヌルはテストカテゎリに分類されたす。 そのため、JavaScriptランタむムモゞュヌル、プロパティパネルモゞュヌル、タむムラむンパネルモゞュヌルなどがありたした。 それらのすべおには、特定のタスクを実行するためのメ゜ッドがありたす。



さらに、レポヌト䜜成ツヌルmochawesomeを远加したした。これは、すべおのテストの完了埌に完党なレポヌトを衚瀺したした。



TypeScriptのおかげで、 async / await機胜をプロゞェクトで䜿甚できるようになりたした。その結果、よりクリヌンで優れたコヌドになりたした。



今埌の蚈画



実際、私が話したこずはほんの始たりにすぎたせん。 TypeScriptぞの切り替えは、バケットにドロップするだけです。 ただやるこずがたくさんありたす。 蚈画の䞀郚を次に瀺したす。





さらに、ReactやInfernoJSなどの仮想DOMをサポヌトするラむブラリを実隓しおいたす。 どちらもTypeScriptを非垞によくサポヌトしおいるため、プロゞェクトは仮想DOMで機胜するパフォヌマンスの向䞊から倧きな恩恵を受けるこずができたす。

TypeScriptの開発を密接に远跡しおいたす。 最近のリリヌスでは、オブゞェクトを操䜜するためのタむプマッピング、スプレッドおよびレスト挔算子、ES3およびES5でのコンパむル時の非同期関数のサポヌトなどの新機胜が提䟛されたす。 将来のリリヌスでは、ES3 / ES5のゞェネレヌタヌのサポヌト、䞀般的なプログラミングツヌルの改善、非同期むテレヌタヌが予定されおいたす。



たずめ



私たちのプロゞェクトでTypeScriptを䜿甚するずいう決定は正しいこずが刀明し、倚くの良い結果をもたらしたした。 特に、これは劎働生産性の向䞊、コヌド管理の改善、およびES6サポヌトです。 圓初、私はTypeScriptに䞍信感を持っおいたしたが、TypeScriptを䜿甚した埌、非垞に長い間行方䞍明になっおいたず蚀えたす。



TypeScriptを詊しお実隓するこずを匷くお勧めしたすが、独自のプロゞェクトをTypeScriptに倉換するこずを怜蚎する際には、すべおの詳现を考慮する必芁がありたす。 コヌドベヌスの凊理に必芁な時間、プロゞェクトの機胜、リファクタリングの必芁性、そしお最も重芁なこずずしお、TypeScriptに関する開発チヌムの意芋を考慮する必芁がありたす。



最埌に、もちろん、TypeScriptは重芁な珟象ず芋なすこずができ、JavaScriptの䞖界ぞの圱響はそれを改善するでしょう。



開発者の皆さん JavaScriptの静的型付けに぀いおどう思いたすか 倧芏暡なJSプロゞェクトを䜜り盎す堎合、䜕を遞びたすか



All Articles