最初のTypeScriptデモ

最近では、 TypeScriptの5呚幎蚘念が行われ、週1回の技術䌚議でAndersず開発チヌムず䌚う機䌚がありたした。 TypeScriptの人生における重芁なマむルストヌンを祝犏し、プロゞェクトを去っおから4幎間でどれだけの成果を䞊げたかを䌝えたかったのです。







さらに、プロゞェクトの䜜業の最初にTypeScriptで䜜成された叀いデモStradaず呌ばれおいたしたを芋぀けお、珟圚TypeScriptで䜜業しおいる人ず䞀緒に芖聎したした。



今日は、TypeScriptの始たりに぀いおお話したいず思いたす。



開始する



2010幎の秋に、Steve Luccoず私は新しいプロゞェクトに取り組み始めたした。 圌の目暙は、アプリケヌション開発チヌムが倧量のJavaScriptコヌドを管理できるようにするこずでした。 スティヌブは本瀟の耇数のテクニカルディレクタヌず話をしたした。 圌らは、郚門のC ++ / CからJavaScriptぞの急速な移行に぀いお話し、珟圚、プログラムず察話するためのWebアプリケヌションおよび察応するスクリプトの開発に真剣な努力が泚がれおいたす。 開発チヌムには、Visual Studioなどの品質の高いツヌルや、C ++およびC型システムが提䟛する機胜がありたせんでした。 圌らは、JavaScriptぞの移行を促進するために私たちができるこずを知りたいず思っおいたす。 その埌、同様の方向に向かう匷力なITトレンドに泚目したした。



高速なJavaScript゚ンゞンが登堎し、HTML5が開発され、印象的なWebアプリケヌションのサむズず機胜がいく぀か登堎したした。 これらはすべお、WebでのJavaScriptの䜿甚方法の急速な倉化を瀺しおおり、過去数幎はそうではありたせんでした。



その時たでには、前述の問題を解決するための倚くのオプションがすでにありたしたが、それらのどれも私たちに適さず、かなり広い垂堎ニッチの期埅に応えたせんでした。 マむクロ゜フト内では、いく぀かの倧芏暡なチヌムがスクリプトを䜿甚したした 。 これにより、JavaScriptの代わりにCを䜿甚できるようになりたした。 ただし、結果ずしお、実際にプログラムした環境からは遠すぎたした。 これはいく぀かの䞍䟿を匕き起こしたした。 たた、 Google Closure Compilerがあり、JSコヌド内のコメントに埋め蟌たれた豊富なタむプのシステムを提䟛したした。これにより、高床なミニファむプロセスを制埡できたす同時に、タむプに関連する゚ラヌを远跡しお報告できたす。 そしお最埌に、 CoffeeScriptの党盛期がありたした。 CoffeeScriptは、JS開発におけるトランスパむラヌぞの道を開いた、広く䜿甚された最初のJavaScript蚀語でした。 ちなみに、私は最初に次の類掚を䜿甚しおTypeScriptの機胜に぀いおよく話したした「 CoffeeScriptTypeScript :: RubyC/ Java / C ++ 」、しばしば次のように远加したす。 Rubyで曞く人:) 」。



私たちはすぐに、䞊蚘の3぀のテクノロゞヌの亀差点に䜍眮するもの、あらゆる点で既存のものよりも優れたものを䜜成したいず考えたした。 私たちの芋解では、これはセマンティクスず構文が可胜な限りJavaScriptに近い蚀語であるず想定されおいたした。 そのようなプロパティは、それぞれCoffeeScriptずClosure Compilerが所有しおいたした。 さらに、この蚀語が型チェックず䟿利なツヌルをサポヌトするこず、぀たりスクリプトを最倧限に掻甚するこずを望んでいたした。



2010幎の秋ず冬に、マむナヌプロゞェクトずしおTypeScriptの䜜業を開始したした。 リラックスしないために、私たちの仕事の結果が他の人に瀺されるように、やる気を起こさせるために、私たちがやったこずのデモンストレヌションを䌎う内郚プレれンテヌションを蚈画したした。 これは、Microsoftの研究および゜フトりェア開発チヌムのプログラミング蚀語スタッフが招埅されるミニ䌚議であるこずになっおいたす。 しかし、むベントの1か月前に、スティヌブ圓時チヌムで唯䞀の゚ンゞニアが手銖を負傷したため、正垞にプログラミングできたせんでした。 その結果、蚈画されたパフォヌマンスを回避したくないので、実際に動䜜するコンパむラがなくおも、私たちが目指しおいるこずを実蚌できるすべおのものを収集するこずにしたした。 すぐに、スティヌブは最初の真のTypeScriptコンパむラヌを䜜成したした。これにより、最初の内郚ナヌザヌ埌にVSコヌドになったものを䜜成したチヌムがTypeScriptを䜿甚しお実際の問題を解決できるようになりたした。



最初のデモンストレヌション



以䞋は、2011幎2月1日に小芏暡チヌム以倖のStradaデモで䜿甚した䞻芁なコヌドです。



<!DOCTYPE html> <html> <meta http-equiv="X-UA-Compatible" content="IE=9"> <head>    <title>JavascriptWebClient</title>    <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.5.1.js" type="text/javascript"></script> </head> <body>    <h1>Employee Pay</h1>       <h3><font color="#3AC1EF">▍SalesEmployee's are paid: <span id='salesEmployeePay'></span></font></h3>    <div id='results'></div>    <script type='text/strada'>        extern var $;        class Employee(string name, double basepay) {          public double calculatePay() {            return basepay;          }        }        class SalesEmployee(string name, double basepay, double salesbonus) : Employee(name, basepay) {          public string getName() { return name; }          public double calculatePay() {            return base.calculatePay() + salesbonus;          }        }        var employee = new Employee('Bob', 1000);        var salesEmployee = new SalesEmployee('Jim', 800, 400);        $('#salesEmployeePay').html(salesEmployee.calculatePay());    </script>    <!-- Load the Strada compiler to processs text/strada tags -->    <script src='StradaCompiler.js' type="text/javascript"></script> </body> </html>
      
      





最終的にTypeScriptず呌ばれる蚀語になった芁玠が倚数ありたす。



  1. 泚釈を必芁ずせずに行28〜30で型を適甚する暗黙的なプロセス。

  2. クラス-アプリケヌションメカニズムず倉数のタむプの実装を蚘述する方法ずしお。 クラスは単玔なJavaScriptでは䟿利ですが、TypeScriptではより重芁な圹割を果たし、実装ず型の䞡方を䞀床に蚘述でき、二重の䜜業を行う必芁がありたせん。

  3. extern



    キヌワヌド。タむプ情報が提䟛されおいないたたはただ提䟛されおいない堎合でも、通垞のJSコヌドおよびラむブラリず透過的に察話できたす。



ただし、ここでは、最終的にTypeScriptから削陀したものを芋るこずができたす。



  1. クラス構文 ここに瀺されおいる、より「機胜的な」クラス構文を䜿甚したかったのです。 私は、少し前に、クラスに同様の簡朔な構文を䜿甚するFに取り組みたした。 さらに、Cの同様の構文に぀いおも説明したした。 この構文は、ECMAScriptで暙準化されたクラスのプロトタむプに基づくアプロヌチで芋られるように、オブゞェクトプロパティの代わりに、圓時人気があったJavaScriptの「クラス」で状態を衚すためにクロヌゞャヌを䜿甚するスタむルに適しおいるこずに泚意しおください。 このトピックは、TypeScriptのリリヌスたでほずんど議論の䜙地がありたした。



    ECMAScriptのクラスで発生したこずは別の方向に進み、TypeScriptを将来の暙準に近づけたいず考えたしたが、暙準の構成䜓の䞊にTypeScriptクラスを蚘述しなければならないずいう事実は嫌いでした通垞の状況では、名前の4倍の繰り返しになりたす倉数。 その結果、暙準ぞの準拠を匷調したした。 それは危険でした。 事実は、ES6がどのような運呜を埅っおいるのかが完党には明らかではなかったずいうこずです。 ES4のように、圌は出おこなかっただろう。 しかし、私たちにずっお最も重芁なこずは、JavaScriptの䞭で最も軜量な抜象化であるず想定されおいたTypeScriptの䞻芁な目暙に埓うこずでした。 。

  2. プレフィックスずしおタむプを指定したす。 䞊蚘のコヌドでは、 string name



    代わりにstring name



    ようなものを芋るこずができたすname: string



    string-珟代のTypeScriptで䜿甚されるレコヌド。 珟圚any



    ず呌ばれおいる型にvar



    キヌワヌドを䜿甚したため、最初はこの構文に傟倒しおいたした。 これにより、 var x = 




    ような匏で明瀺的にany



    型に暗黙的にキャストできたす。 さらに、これは、暗黙的なvar



    型がそこに珟れたずきにCで最近行われたものに䌌おいたした。 しかし、この䜍眮に型情報を配眮するための蚀語の文法は、解析に倚くの問題をもたらしたす。 さらに、この分野では、JavaScriptなどの蚀語でフォヌマットname: string



    を䜿甚した貎重な先䟋がありたしたname: string



    たず、ActionScriptであり、ECMAScript4で出おきたせんでした。 その結果、ここで䜿甚されおいるアプロヌチを非垞に早く倉曎したした。 最初のプレれンテヌションから2か月埌に行ったコヌドサンプルでは、​​コロン構文が既に䜿甚されおいたす。

  3. スヌパヌクラス。 class Foo : Bar



    デザむンのclass Foo : Bar



    Cスタむルのスヌパヌクラスのclass Foo : Bar



    たした。 その埌、 extends



    䜿甚に切り替えたした。

  4. スクリプトをコンパむルするアプロヌチ。 ここにもう1぀小さなものがありたす。 コヌドは<script type="text/strada">



    ブロックにあり、コメントにはStradaCompiler.js



    が "on the fly"ず呌ばれるtext/strada



    ブロックのコンパむルを担圓しおいるこずにStradaCompiler.js



    おStradaCompiler.js



    。 次に、プロゞェクトのアセンブリの独立したステヌゞを䜿甚する代わりに、 <script>



    タグを䜿甚しおTypeScriptをHTMLに盎接配眮し、この組み蟌みコヌドがペヌゞの読み蟌み時に転眮および、できればキャッシュされるこずを想像したした。 圓時、このアプロヌチはCoffeeScriptの小芏暡プロゞェクトで䞀般的でしたが、かなり倧きな開発チヌムず議論した結果、ほずんどの堎合ではなくずも、倚くの実際の状況でこれが非実甚的であるこずがわかりたした。 実際には、このような問題は、WebPackなどのツヌルを䜿甚しお最終的に解決されたした。WebPackは、コヌドを動的に再コンパむルしたしたが、コンパむルされた圢匏でブラりザに衚瀺したした。



私はこれがすべお花であるず蚀わなければなりたせん。 さらに興味深いのは、このコヌドをどのように機胜させるかです。



どのように機胜したしたか



その埌、FでJavaScriptむンタヌプリタヌを䜜成するための小さな2次プロゞェクトがありたしたFでの䜜業からJavaScriptでの䜜業に切り替える手段のようなものです。 このプロゞェクトの䞀郚は、かなり安定したJavaScriptES5パヌサヌでした。 Stradaに远加した新しいコンストラクトをサポヌトするために、いく぀かの文法を倉曎したした驚くほど少数が必芁でした。 基本的には次のようになりたした。



 @@ -459,8 +466,12 @@ StatementList:    | Statement                              { [$1]} // See 12.2 VariableStatement:                          -    | VAR VariableDeclarationList SEMICOLON  { VariableStatement(List.rev($2)) } -    | VAR VariableDeclarationList            { VariableStatement(List.rev($2)) } +    | Type VariableDeclarationList SEMICOLON  { VariableStatement([], false, $1,List.rev($2)) } +    | Type VariableDeclarationList            { VariableStatement([], false, $1, List.rev($2)) } +    | READONLY Type VariableDeclarationList SEMICOLON  { VariableStatement([], true, $2,List.rev($3)) } +    | READONLY Type VariableDeclarationList            { VariableStatement([], true, $2, List.rev($3)) } // See 12.2 VariableDeclarationList:    | VariableDeclaration                                  { [$1]}
      
      





ちなみに、この初期バヌゞョンではreadonly



だったようです。



結果のASTを通垞のJavaScriptずしお出力する方法を芋぀けたしたが、型を砎棄する代わりに、クロヌゞャヌコンパむラによっおそれらをコメントに倉換したした。 その結果、デザむンは特に安定しおいないこずが刀明したしたが、デモを開始するにはこれで十分でした



その埌、これは非垞に論理的であり、型チェックツヌルの圢匏で結果のコヌドをクロヌゞャコンパむラず呌びたした。 Closure CompilerはAppEngineに䟿利なサヌビスがあり ただありたす 、その結果、コヌドをPOSTリク゚ストずしおこのサヌビスに送信し、゚ラヌに関する情報を受け取りたした。



圓時、SilverlightおよびFlashは、クラむアントアプリケヌションの開発においお䟝然ずしお重芁な圹割を果たしおいたした。 そのため、パヌサヌFで蚘述を開始するために、 text/strada



スクリプトを怜出し、それらを解析し、クロヌゞャヌを送信し、゚ラヌを報告するSilverlightアプリケヌションずしおペヌゞに配眮したした。



 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using System.ServiceModel.Activation; using System.Net; using System.IO; using System.Web; namespace JavascriptWebClient.Web {   // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "ClosureCompile" in code, svc and config file together.   [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]   [ServiceBehavior(IncludeExceptionDetailInFaults=true)]   public class ClosureCompile : IClosureCompile   {       public string DoWork(string srcText)       {           System.Diagnostics.Debug.WriteLine("Hello!");           var request = WebRequest.Create("http://closure-compiler.appspot.com/compile");           request.Method = "POST";           request.ContentType = "application/x-www-form-urlencoded";           var stream = request.GetRequestStream();           // Send the post variables            StreamWriter writer = new StreamWriter(stream);           writer.Write("output_format=xml");           writer.Write("&output_info=compiled_code");           writer.Write("&output_info=warnings");           writer.Write("&output_info=errors");           writer.Write("&output_info=statistics");           writer.Write("&compilation_level=ADVANCED_OPTIMIZATIONS");           writer.Write("&warning_level=verbose");           writer.Write("&js_code=" + HttpUtility.UrlEncode(srcText));           writer.Flush();           writer.Close();           var response = request.GetResponse();           Stream responseStream = response.GetResponseStream();           StreamReader reader = new StreamReader(responseStream);           // get the result text            string result = reader.ReadToEnd();           return result;       }   } }
      
      





このコヌドはいく぀の思い出を呌び起こしたすか...



その結果、開発者ツヌルのツヌルを䜿甚しお<script>



内容を倉曎する際の゚ラヌに関するむンタラクティブな情報を受け取るこずができ、バックグラりンドタむプチェックシステムがここで機胜するずいう印象を䞎えたした。 これにより、達成したい䞻芁な機胜のいく぀かを実蚌するこずができたした。 確かに、このすべおがどのように行われたかは、少なくずも1人の本物のプログラマがプロゞェクトに取り組むのに適しおいたせんでした。



次に、別のコヌドを瀺したした。 ここでは、結果ずしおTypeScriptになったものずはさらに興味深い違いをいく぀か芋るこずができたす。 たずえば、 number



代わりにdouble



型 int



远加するこずを考えたしたが、これによりJavaScriptのセマンティクスから遠ざかりたした、Cで慣習的なむンタヌフェむスのI



プレフィックス。 むンタヌフェむスや、型指定されおいないオブゞェクトず厳密に型指定されたクラスの芁玠の怜玢を自由に混圚させる機胜など、残っおいるものもいく぀かありたす。



 interface IHashtable {   double lookup(string i);   void set(string i, double d);       } class Hashtable() {   var o = {};   public double lookup(string i)   {       return this.o[i];   }   public void set(string i, double d)   {       this.o[i] = d;   } } interface IExpression {   double evaluate(IHashtable vars); } class Constant(double value) : IExpression {   public double evaluate(IHashtable vars) {       return value;   } } class VariableReference(string name) : IExpression {   public double evaluate(IHashtable vars) {       var value = vars.lookup(name);       return value;   } } class Operation(IExpression left, string op, IExpression right) : IExpression {   public double evaluate(IHashtable vars) {       double x = this.left.evaluate(vars);       double y = this.right.evaluate(vars);       switch (this.op) {           case '+': return x + y;           case '-': return x - y;           case '*': return x * y;           case '/': return x / y;       }   } } IExpression e = new Operation(new VariableReference("x"),'+',new Constant(3)); function f() {       IExpression e = new Operation( new VariableReference("x"),           '*', new Operation( new VariableReference("y"), '+', new Constant(2) ));       IHashtable vars = new Hashtable();       vars.set("x", 3);       vars.set("y", 5);       e.evaluate(vars); // Outputs "21"       vars.set("x", 1.5);       vars.set("y", 9);       return e.evaluate(vars); // Outputs "16.5"   } f();
      
      





たずめ



最初のデモから玄1幎半埌、 TypeScriptをリリヌスしたした 。 そしお、5幎埌、TypeScriptは゜フトりェア開発業界で最も急速に成長しおいるプログラミング蚀語の1぀になりたした。



さお、これを倖郚のオブザヌバヌずしお芋るず、TypeScriptチヌムが蚀語の最初のアむデアを固守する䞀貫性を賞賛せざるを埗たせん。 重芁なのは、TypeScriptはJavaScriptの単なる軜量な抜象化であるずいうこずです。 たた、元々指定されおいた同じフレヌムワヌクを保持したたた、蚀語がどのように発展するかずいう楜しい印象を䜜り出したす。 ぀たり、その目的は、ほずんどすべおのJavaScriptプロゞェクトで生産的に䜿甚できる型システムを提䟛するこずです。 TypeScriptは、JS゚コシステムにおける新しいフレヌムワヌクず開発スタむルの出珟により、その理想に忠実であり続けおいたす。



TypeScriptの蚘念日におめでずうございたす。 開発チヌムずTSコミュニティに感謝したす。どのTypeScriptがすばらしい仕事をしおいるかに感謝したす。



芪愛なる読者 TypeScriptを䜿甚しおいたすか



All Articles