TypeScript – jazyk, na který jsem čekal

Microsoft představil nový jazyk, TypeScript, který je v podstatě transpilerem do JavaScriptu jako mnoho dalších, jen se mi tentokrát celý projekt zdá vzatý za správný konec. Nerad bych to zakřiknul, ale mám pocit, že TypeScript bude velký, a tady bych chtěl sepsat pár prvních dojmů.

Hned jedna z úvodních vět cca hodinové prezentace Andrese Hejlsberga dobře vystihuje, proč se mi TypeScript na první pohled tolik líbí:

“All JavaScript code is TypeScript code”

Zamyslete se nad tím – veškerý JS kód, který byl kdy napsán, tj. jQuery, Node.js, Underscore, Mootools, cokoliv, je TypeScript. Z toho okamžitě plynou některé věci:

  • Jakýkoliv JavaScript jde používat přímo, není potřeba psát žádné wrappery apod.
  • Syntaxe je céčková (pro někoho jasná nevýhoda, pro mě jasná výhoda).
  • Existuje velmi nízká bariéra vstupu pro lidi, kteří už JS aspoň rámcově umí.

Tahle value proposition mně osobně zní skvěle.

Typový systém

Důvod, proč se TypeScript jmenuje tak, jak se jmenuje, je, že nad JavaScript přidává typový systém. Tohle opět bude mít své příznivce i odpůrce, ale za mě je typová kontrola naprostým základem produktivního prostředí (bez statických typů pracovat samozřejmě lze, ale nevidím důvod, proč to dělat dobrovolně). Byl jsem zvědavý, jak TypeScript typový systém řeší, a i tady musím říct, že mi to připadá dobré jak v principu, tak v detailech.

Co se onoho “principu” týče, líbí se mi, že TypeScript používá duck typing, který je JavaScriptu blízký a který není tak přísný, jako např. typový systém v C#. Například

 interface Person {
    firstname: string;
    lastname: string;
}

var person: Person = {firstname: "Borek", lastname: "Bernard", whatever: 123};

typový kontrakt naplňuje, zatímco následující kód nikoliv:

var person: Person = {firstname: "Borek"};

Dobré taky bylo slyšet, že MS tuhle věc nevyvíjel s hlavou v písku – Hejlsberg třeba zmiňoval Closure Compiler a jaké limity má zápis typů v komentářích.

Moc hezky mají udělanou typovou inferenci – často lze datový typ zapsat jen na nějakém místě, třeba někde uvnitř funkce, a kompilátor pozná, že když se daná věc z funkce vrací, má takový být i návratový typ funkce, typ proměnné, do které se přiřazuje atd. No a datové typy jsou samozřejmě volitelné (jinak by nemohlo platit, že JS ⊂ TS).

V praxi je potom typový systém užitečný hlavně pro statickou kontrolu kódu a pro lepší podporu v nástrojích, takže Anders ukazoval, jak jim třeba spolehlivě funguje rename refactoring, jak po window.onmousemove = function(e) { e. začne Visual Studio napovídat specificky vlastnosti, které jsou na typu MouseEvent, apod. Pro vývoj v lepších jazycích je to samozřejmě už dlouhá léta standard, ale JavaScript je tímto země nepolíbená, takže díky za to, Microsofte!

Třídy, moduly apod.

Pro strukturování rozsáhlejších zdrojových kódů přidává TypeScript podporu pro rozhraní, třídy a moduly, vše s intuitivní syntaxí, kterou asi není potřeba příliš rozebírat. Na modulech je hezké, že mohou rovnou spolupracovat s existujícími CommonJS i AMD knihovnami, takže v prezentaci byl k vidění např. rychlý custom modul používající Express, všechno naprosto seamless. Super.

Soubory deklarací pro externí knihovny typu jQuery

Za zmínku stojí způsob, jakým TypeScript pracuje s typovými informacemi v knihovnách, které byly vyvinuté v čistém JavaScriptu (a typové informace tedy nemají). Pro ně lze vytvořit, a Microsoft tak již pro pár vyvolených udělal (jQuery, jQuery UI, Node apod.), soubor typu jQuery.d.ts (.d jako deklarace, .ts jako TypeScript), takže není potřeba sahat do původních zdrojáků a TypeScript kompilátor má přesto víc informací pro compile-time.

Doplňování kódu, které Anders ukazoval pro jQuery, bylo s přehledem nejlepší, jaké jsem kdy v jakémkoliv nástroji viděl. Například současné Visual Studio má mít údajně skvělou podporu pro jQuery a JavaScript obecně, ale když si necháte napovědět, co všechno dělá dolar, uvidíte akorát ručně psanou, kdoví jak přesnou dokumentaci, často bez zmínek o přesných typech. Code completion v TypeScriptu ukazuje jednotlivá přetížení metod samostatně a s plnou typovou informací, i třeba o očekávané signatuře callbacků (to mi v čistém JS připadá jako jedna z nejproblematičtějších věcí, callbacky jsou všude a bez otevřené dokumentace v druhém okně se prakticky nedá dělat). Prostě TypeScript napovídá přesně tak, jak to dělá např. C# nebo podobné vyspělé jazyky, a člověk se může soustředit na psaní kódu, ne na věčné dohledávání typových detailů.

Co se mi ne úplně líbí

Vlastně toho je hrozně málo a jsou to relativní maličkosti. Například detail, kam psát typy, mi připadá vyřešený správně – za dvojtečku (bál jsem se, že tvůrce C# bude příliš trvat na Javovském / C# zápisu typu před identifikátor, což by se do JS moc nehodilo). Ale osobně bych bral, aby se základní typy psaly normálně s velkým písmenem, např. String nebo Number. S malým to prostě vypadá divně.

A pak je ještě jedna věc, které bych se trochu bál. Některé konstrukty vycházejí, nebo se snaží být velmi blízké, ECMAScriptu šestce. Udržet TypeScript v harmonii s ES6 je sice v teoretické rovině hezká myšlenka, ale Adobe si s podobnou snahou u ActionScriptu a ve své době chystaného ECMAScriptu 4 vylámalo zuby. Pravda, Microsoft má poněkud větší motivaci být s ECMAScriptem ve shodě, protože TypeScript potřebuje, aby potenciální budoucí verze JavaScriptu a JavaScriptových knihoven byly s TypeScriptem ve shodě, ale to se může velmi snadno obrátit proti nim – možná bude potřeba dělat do jazyka zpětně nekompatibilní změny, což je věc, kterou nikdo, Anders zvlášť, nemá rád.

Možná už z prezentace byl jeden problém vyplývající s kompatibility s ES6 vidět – např. změna zápisu z function() na lambdu zásadně mění sémantiku klíčového slova this. Z pohledu JavaScriptu je to akceptovatelné, ale z pohledu jazyka, který by měl být hezký a předvídatelný, to je IMO dost nemilá skutečnost. Tak uvidíme, jak se to vyvine.

Budoucnost patří aluminiu

Tak, to je z prvních dojmů asi tak všechno. Zatím se neví, jak přesně to bude s vynecháváním nepoužívaného kódu (silná zbraň Closure; TypeScript kód nějakým způsobem optimalizuje, ale kdo ví, jak dobře), jak se budou psát doc komentáře (moje úchylka, jsem asi jeden z mála programátorů, který komentáře považuje za užitečné, ale současný Microsoftí způsob se třemi lomítky a podivnou XML syntaxí je doufám jen úlet nějakého Project Managera a do TypeScriptu se dostane normální JSDoc) atd. atd.

TypeScript je zatím preview, ale už teď můžu říct, že jsem dlouho neviděl podobné “světlo na konci tunelu” jako při koukání na Andersovu prezentaci. Vím, že jsou lidi, kterým vývoj v JavaScriptu v současné formě a při současných nástrojích vyhovuje, ale já jsem rozmazlený z ActionScriptu, C# a podobně, přitom současně nevěřím na myšlenku, že by JS vývoj mohl být spasen věcmi jako GWT nebo cross-kompilátorem Flexu do HTML5.

Proto jsem nadšený z jazyka, který je JavaScriptu tak blízko, jak jen to jde, a přitom odstraňuje většinu jeho bolístek. Dobrá práce, Microsofte, velmi dobrá!

http://www.typescriptlang.org/

23 thoughts on “TypeScript – jazyk, na který jsem čekal
  1. Ahoj!

    jakou ma podle tebe TypeScript sanci prosadit se i mimo Microsoft prostredi?

    — s.

  2. No nevím, stokrát milejší by mě byl nový moderní ECMAScript, ale když lidstvo se tak těžko a pomalu na něčem domlouvá :(

  3. Slavo, nevím a říkám si, jestli je to pro mě jako pro koncového uživatele vůbec důležité. Např. kolem určitého frameworku XYZ je velikost komunity důležitá až klíčová věc, ale kolem TypeScriptu? Možná by rychleji přibývaly *.t.ds soubory, ale v podstatě mi může být jedno, jestli se TypeScript ostatním líbí nebo ne. Takže ať si každý používá, co chce :)

    Na teoretické úrovni bude patrně na Linuxu (aspoň zatím) problém v tom, že tam chybí tooling. To je na Windows / ve Visual Studiu značná přidaná hodnota.

  4. Petr: IMO je dobře, že to není víc C#. Pokud chceš něco takového, máš Script#, který mimochodem taky nedávno ohlásil podporu pro AMD, Node.js atd.

  5. Bojím se, že Microsoft je moc “ne-kůl” společnost pro to, aby se tento jazyk uchytil v tak kůl prostředí, jako je web development.

  6. Google s GWT už asi moc nepočítá, nedávno jsem někde četl, že nějakou app předělali do AngularJS (takže vlastně čistý Javascript) a kolik na tom uspořili kódu. To už spíš ten Dart.

  7. string je primitivní datový typ, String je typ objektu. typeof '' vrací string, ale obj instanceof string je běhová chyba, je potřeba psát obj instanceof String.

    Takže uvádění string se mi zdá v pořádku – zdůrazňuje se tím, že lze předat i primitivní typ, nejen objekty daného typu.

  8. Ano, to je skoro určitě důvodem, proč tam jsou malá písmena, a taky jsem nepsal, že by mi to připadalo jako chyba. Ale i když vím, proč tam to malé mají, stejně bych tam preferoval velká písmena i u těchto primitivních typů.

  9. Že TypeScript má super fíčury je jasné.

    Jenže, super fíčury jsou i mimo TS. Let statement, array comprehentions, destructive assignment, pipe operators |> a <|. Ať už je to ES6, CoffeeScript, LiveScript nebo Dart.

    Zajímalo by mě, jaká je asi strategie Microsoftu v těch desítkách vylepšení, co se do JS dají dodat a co ostatní transpilery umí. Je to vůbec jejich úmyslem?

    Výhoda netypového jazyku bez IDE je, že dodělat takové libůstky do parseru je triviální, nic se nerozbije a obarvování dělá sada regulárů :-). Nicméně v případě tohoto podniku je to trochu někde jinde, už jenom proto že je to, ač opensource, tak Microsoft. Je na to navázané Visual Studio (ikdyž volně) atd…

    Nebudou náhodou uživatelé TypeScriptu psát následujících dekádu for cyklus ze 70. let?

  10. Je dobré, že MS přišel s něčím, co je hodné jeho slávy v minulých dobách. Co nemůže být pro všechny a pro všechno, musí být scalable, neboť co je pro všechny – je pro nikoho. MS prošvihl potenciál VB, který byl (svého času) velmi rozšířen. Mohli jste si vybrat VB nebo VBA nebo VBS a všechno to do sebe zapadalo. Na klientu IE nebo Office nebo Corel Draw atd…, na serveru od ASP až po WebClass (který v Česku zaspali) atd… ActiveX a WebClass daly poteciál ASP&NET… Proč to píšu? Protože stačí zaměnit VB za JS, posuňte dějiny o 12 let a máte to hotové. JS míří dnes i na servery atd… JS není vrtošivé, přežilo, co nezabiješ, to se posílí. Co přežilo a posílilo? JS a HTML. A tohle všechno MS měl a kdysi dával světu: VB/A/S & DHTML. Dnes to převzalo JQuery apod. Tedy dobré uchopení JS je důležité. Skvělý je CoffeeScript. Skvělý je TypeScript. Skvělé je, že to jde dohromady.

  11. Zkusil jsem si do TypeScriptu přepsat jednu existující knihovničku. Víc než o typovou kontrolu mi šlo o srozumitelný zápis tříd a modulů. Na JavaScriptu mi vadí, že sice v něm jakožto v assembleru mohu napsat cokoliv, ale kód se pomalu chápe, protože je to série různých triků a emulací.

    Přepísování šlo příjemně a svižně, především proto, že

    JavaScript je TypeScript, takže člověk může postupovat po libovolných krůčcích
    syntaxe je intuitivní, člověk něco zkusí a je to správně

    Narazil jsem asi jen v případě „arrow“ funkcí, kde nevím, jak se dostat k dynamickému this, mrzí mě absence něčeho jako self pro přístup ke statickým členům (je třeba uvádět název třídy), velice by se hodil syntactic sugar pro cykly a pod, snad se do verze 1.0 dočkáme.

    Vlastně mě docela překvapilo, že kód zapsaný v TypeScriptu nevykazoval takřka žádnou úsporu co se týče velikosti zdrojáků. Ve zkomprimované podobě (přes Google Closure, TypeScript komprimovat neumí) byl nachlup stejně velký jako původní zdroják, což dává smysl.

    Jsem hodně zvědav, kam se tohle bude vyvíjet, protože jsem s TypeScriptem dělal pár hodin a už si neumím představit, že bych se vracel k JavaScriptu.

  12. tillda: Ty se na to díváš pohledem “language geeka”, Microsoft pohledem pragmatika. TS určitě není nejprogresivnější jazyk, ani zdaleka ne, ale třeba mně právě tohle vyhovuje. Pokud budu chtít nějakou exotiku, tak na trhu už rozhodně je z čeho vybírat.

    BTW chystá se podpora ve WebStormu, takže podpora v nástrojích bude x-platform.

  13. To že TypeScript “Interface DSL” nemá konstrukci na typovaný/odlišný this ve funkcích mě také zarazilo, to je zas taková úžasná geekovina, co bude Borkovi k ničemu :-). Totiž, jsem nadrženej na typesafe bloky z Ruby, to by byla neskutečná prča!

  14. V tejto dobe je JS pomaly jedinou voľbou, v čom písať desktop-like web aplikácie, avšak s jeho syntaxou a typovou kontrolou/nekontrolou človeka nutne pri väčšom projekte rozbolí hlava. Existujú projekty , ktoré to riešia, napr Jangaroo, ale sú málo známe. Čakal som tiež, že Adobe využije svoj Action script a dotiahne do zdarného konca Falcon, predbehol ho však Microsoft, čo som priznám sa veľmi nečakal. V každom prípade, konečne nejaké svetlo, aj keď tunel sa zatiaľ zdá poriadne dlhý. Keď vidím, ako málo dokážu JS webové framevorky, TypedScript určite nájde svoje uplatnenie.

  15. Pod menom FalconJS sa dá nájsť viac projektov, ja som myslel projekt Adobe spomínaný v roku 2011 FalconJS

  16. Super, super, super.
    Od Excelu97 snad prvni MS udelatko, ktere meni pravidla a nema alternativu(?). Nejsem zadny JS guru, ale tohle je vazne supr. Pro spoustu ludi (pro me) je tohle enabling technologie pokud se tyka plnohodnotneho OOP kodu. Super je moznost vygenerovani definicnich souboru pro dalsi JS knihovny.

  17. I see you don’t monetize your website, don’t waste your
    traffic, you can earn additional cash every month because you’ve got
    hi quality content. If you want to know how to make extra bucks, search for:
    Ercannou’s essential adsense alternative

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax