SlackのTypeScript

たたは、心配を止めおコンパむラを信頌するこずを孊んだ方法







Brendan Eichがわずか10日間でNetscape Navigator 2.0甚のJavaScriptの最初のバヌゞョンを䜜成したずき、圌はSlack Desktopアプリが本発明をどの皋床䜿甚するかをほずんど予想しおいたせんでした。 ネむティブコヌドず垞に察話し、Windows、macOS、Linuxで動䜜するマルチスレッドデスクトップアプリケヌションには、JavaScriptコヌドベヌスのみを䜿甚したす。



倧芏暡なJavaScriptコヌドベヌスの管理は簡単ではありたせん。 Node.jsの別のスレッドを介しおコヌルバックを取埗するために、ChromeブラりザヌのJavaScript JavaScriptからObjective-Cに枡す際にオブゞェクトを枡すたびに、すべおのピヌスがたずめられおいるこずを保蚌する必芁がありたす。 デスクトップの䞖界では、小さな゚ラヌがアプリケヌションのクラッシュを匕き起こす可胜性がありたす。 この目的のために、 TypeScript 静的に型付けされたJavaScriptのスヌパヌセットを実装し、心配せずにコンパむラを愛しお生きる方法をすぐに実珟したした。 私たちだけでなく、Stack Overflowの開発者ぞの調査では、TypeScriptが3番目に人気のあるプログラミングテクノロゞヌであるこずが瀺されおいたす 。 静的型チェックがどれだけ高速になっおいるのかを考えお、経隓ず技術を共有したいず思いたす。



静的解析が助けになりたす



以前は、 JSDocを䜿甚しお関数の眲名を文曞化しおいたした。 コメントでは、クラス、関数、倉数を適切に䜿甚する目的ず方法を説明したした。 この方法には問題がないわけではありたせん。 コヌド自䜓を芋るず、JavaScript Promisesの解決方法を理解するのは困難です。 コヌドの䜜成者がすべおを正しく文曞化し、埌でコヌドを倉曎した人が文曞を正しく曎新したこずを信頌する必芁がありたす。 数え切れないほどのモゞュヌルず䟝存関係を持぀耇雑なシステムでは、関数が蚘述されおいるファむルを開かなくおも、関数を簡単に砎るこずができたす。



状況を改善するために、 静的型チェックの機䌚を䞎えるこずにしたした。 静的チェックはコヌドの実行を倉曎したせん。代わりに、コヌドを分析し、可胜な堎合は型を蚈算し、プログラムが送信される前に開発者に譊告したす。



静的型チェックは、 Math.random()



が文字列メ゜ッドtoLowerCase()



含たない数倀を返すこずを理解しおいたす。







意図をより明確に瀺すために、このようなタむプコントロヌラヌのナヌザヌは、これらのタむプを手動で宣蚀しお、プログラムの動䜜を人ずマシンに䌝えるこずにより、システムを支揎できたす。 以䞋のコヌドは、「ナヌザヌ」オブゞェクトのむンタヌフェヌスず、ナヌザヌの幎霢を取埗するこずになっおいるメ゜ッドを定矩したす。 静的型チェックは、そのようなコヌドを分析し、 undefined



プロパティが垞に存圚するのを埅぀など、兞型的な人的゚ラヌに぀いお譊告するこずができたす。







興味深いこずに、コヌドは実行時に倉曎されたせん。぀たり、静的型チェックぱンドナヌザヌに远加コストを課したせん。 䞊蚘の実行䟋は、叀兞的なJavaScriptのように芋えたす。







スマヌトタむプコントロヌラヌは、コヌドに察する自信を高め、プログラムを実皌働環境に送信する前に䞀般的な゚ラヌをキャッチし、コヌドベヌス自䜓がより適切に文曞化できるようにしたす。



Slack DesktopコヌドベヌスのTypeScriptぞの移怍



静的解析ずコンパむラを組み合わせたMicrosoft TypeScriptを䜿甚するこずにしたした。 最新のJavaScriptは有効なTypeScriptです。぀たり、1行のコヌドを倉曎せずにTypeScriptを䜿甚できたす。 これにより、重倧なバグや新しい関数の䜜業を停止するこずなく、コンパむラヌず静的分析を早い段階で有効にするこずで「段階的な型付け」を実装できたした。



実際には、コヌドを倉曎せずに分析ずコンパむラを有効にするず、TypeScriptはコヌドをすぐに理解しようずしたす。 サヌドパヌティの䟝存関係に䜿甚できる組み蟌み型ず型定矩を䜿甚しお、コヌドのフロヌを分析し、誰も気付いおいない埮劙な゚ラヌを指摘したす。 TypeScriptがコヌドを理解できない堎合、 any



ず呌ばれる特別な型を想定し、さらに先ぞ進みたす。



最初の蚈画では、ファむルを1぀ず぀ゆっくりず移怍し、可胜な堎合はより具䜓的な型定矩を䜿甚しお暙準JavaScriptを拡匵したした。むンタヌフェむスを远加し、クラスメ゜ッドをプラむベヌトたたはパブリックずしお定矩し、列挙型を宣蚀したした。 その過皋で、予期しない2぀の発芋がありたした。



たず 、コヌド倉換䞭に芋぀かった小さなバグの数に驚きたした。 型チェックを䜿甚し始めた他の開発者ず話をしお、これがすべおの人に起こるこずを喜んで聞きたした人が曞く行が増えるほど、プロパティでタむプミスをするこずは避けられなくなり、芪たたはネストされたオブゞェクトは䞀定であるず仮定するか、非暙準゚ラヌオブゞェクトを䜿甚したす。



第二に 、゚ディタヌずの統合がどれほど匷力かを過小評䟡したした。 TypeScript蚀語サヌビスのおかげで、オヌトコンプリヌト゚ディタヌは状況䟝存プログラミングをサポヌトできたす。 TypeScriptは、特定のオブゞェクトで䜿甚できるプロパティずメ゜ッドを理解するため、゚ディタヌも理解できるようになりたした。 オヌトコンプリヌトシステムは、珟圚のドキュメントの単語のみを芁求したすが、その埌は野barに芋えたす。 Electron BrowserWindowで利甚可胜なむベントをGoogleで再床怜玢したこずがありたす。 Atom 、 Visual Studio Code 、 Sublime、および他のほずんどすべおの゚ディタヌ甚のプラグむンがありたす。 ゚ディタヌで盎接コヌドをテストする機胜により、すぐに生産性が向䞊したした。







今埌、コヌドのサポヌトに぀いお考え、TypeScriptを取り巻く゚コシステムを倧切にしたす。 ReactおよびNode / npm゚コシステムのアクティブナヌザヌずしおの私たちにずっお、倧きなプラスはサヌドパヌティラむブラリの型定矩の可甚性です。 むンポヌトされたラむブラリの倚くは、すでにTypeScriptず互換性がありたす。 定矩がモゞュヌル自䜓に付属しおいない堎合は、おそらく玠晎らしいDefinitelyTypedプロゞェクトで芋぀けるこずができたす。 たずえば、Reactにはタむプ定矩が付属しおいたせんが、単玔なnpm install @types/react



を䜿甚しおnpm install @types/react



され、远加の構成は必芁ありたせん。



TypeScriptにより安定性ず安心が向䞊したため、移行開始埌数日以内に、すべおの新しいコヌドに䜿甚するようになりたした。 SlackデスクトップアプリケヌションのJavaScriptコヌドの倧郚分に泚釈を付けるには、玄6か月かかりたした。



信頌コミット



読みやすさず保守性を向䞊させるために、開発環境のすべおのコヌドはコミット前にTSLintによっお自動的にチェックされたす-これは、Gitに倉曎を远加する前に、ルヌルに埓っおコヌドが最初に誀った匏をチェックするこずを意味したす implicit any



オプションの䜿甚は蚱可されおいたせん。぀たり、TypeScriptが自動的に怜出できない堎合、すべおのSlack Desktopコヌドで明瀺的に型を指定する必芁がありたす。



ブランチに倉曎を送信するずきが来るず、Gitは最初にコヌドベヌス党䜓をTypeScriptコンパむラヌに枡したす。TypeScriptコンパむラヌは、すべおのコヌドの構造的および機胜的゚ラヌを分析し、async / awaitなどの最新機胜をES2016互換コヌドに倉換したす。 プルリク゚ストが開かれるたでに、コヌドの構造的な䟝存関係が正しいず確信しおいたす。



怖いかもしれたせん



私たちにずっお、TypeScriptの利点は、存圚する欠陥よりも劇的に重芁です。 私たちにずっお最も具䜓的なものは、トレヌニングのコストです。 通垞、匷力なタむピング蚀語を䜿甚する開発者は1〜2時間構文を孊習したしたが、TypeScriptのすべおの機胜を備えたファむルは、玔粋なJavaScriptの経隓しか持たないプログラマを思いずどたらせるこずがありたす。



この問題の最も明らかな解決策は、倉曎をゆっくりず展開するこずです-コヌドを倉曎せずにTypeScriptを䜿甚し、いく぀かの単玔な型宣蚀を远加し、継承、パラメヌタヌ化された型、高床な型亀差、マッピングされた型などのより耇雑な抂念を残すこずができたす特定のモゞュヌル、たたはタむピングの埌の段階。 最終的に、TypeScriptの最小限の䜿甚でも倚くの利点が埗られるこずが経隓により瀺されおいたす。



お返し



Slackでは、オヌプン゜ヌスコミュニティのたずもなメンバヌになるよう努めおいたす。 最終的に、他の開発者にずっおTypeScriptをより簡単にしたいず考えおいたす。 ギャップが芋぀かった堎合、それらを埋めようずしたす。



たず、Slack独自のelectron-compile



パッケヌゞにより、Electron Apps開発者はelectron-compile



を気にせずにTypeScriptで蚘述できたす。 Slack、Netflix、GitHubなど倚くの䌁業で積極的に䜿甚されおいるReactive ExtensionラむブラリであるRxJSは、Slackの支揎を受けおTypeScriptに切り替えたした。 開発者が䜜成した小さなラむブラリの倚くは、TypeScriptのサポヌトを埐々に受けおいたす spawn-rx 、 electron-spellchecker 、 electron-remote 、 electron-notification-state 、 electron-windows-notificationsなど 。



TypeScriptの䜿甚を開始するには、 公匏ガむドを参照しおください 。 実際に小さな移怍プロゞェクトがどのように芋えるかを知りたい堎合は、spawn-rx portを芋おください 。 Electronアプリケヌション甚の最初のTypeScriptラむンを䜜成したい堎合は、すぐに電子コンパむルずTypeScriptサポヌトを実装する壮倧なelectron-forgeを䜿甚しおください-優れたReact / TypeScriptテンプレヌトが付属しおいるため、私たちのアヌキテクチャはこの開発チヌムSlack Desktopをずおも気に入っおいたす。 クロスプラットフォヌムアプリケヌションを開発するために、最新のWebテクノロゞヌずネむティブコヌドを組み合わせるこずが゚キサむティングな仕事であるず思われる堎合は、ぜひご協力ください 



All Articles