Artikel top billede

(Foto: Computerworld)

TypeScript - Microsofts forslag til et bedre JavaScript

I april blev den første version af Microsoft TypeScript frigivet, og med Update 2 af Visual Studio 2013 i maj er sproget nu et fuldgyldigt medlem af gruppen af programmeringssprog fra Microsoft. Men hvad er TypeScript, hvorfor er det her, og hvad kan det bruges til?.

Af Michell Cronberg, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

Da Brendan Eich for snart 20 år siden skabte JavaScript, havde han med stor sandsynlighed ikke forventet, at sproget ville få så stor betydning, som det har i dag. Nu er Microsoft kommet med et programmeringssprog, TypeScript, som kan forbedre JavaSript. Men for at forstå baggrunden for det må vi først en tur ned i JavaScripts historie.

JavaScript blev født hos Netscape i Californien i midten af 90’erne og indbygget i Netscape-browserens version 2 for at styrke den i kampen mod Internet Explorer. Brendan Eich fik under 14 dage til at skabe sproget, og han baserede det på features fra sprog som det funktionsorienterede Scheme og objektorienterede Self. Hans mål var at skabe et sprog, der kunne benyttes af hjemmeside-snedkere, og da de typisk ikke var hardcore-udviklere, måtte sproget nødvendigvis være relativt simpelt og til en vis grad overbærende over for syntaksfejl.

Ikke helt færdigbagt

At sproget i realiteten ikke var bagt færdigt inden frigivelsen med Netscape – og det faktum, at det var rettet mod hobbyudviklere – gør, at det indeholder nogle ret graverende designfejl. Det, kombineret med det faktum, at et script ikke var designet til at bestå af flere tusinde linjers kode, betyder, at JavaScript i realiteten ikke bør benyttes til store applikationer.

Men JavaScripts bliver i praksis brugt at til udvikle meget store applikationer (tænk bare på Google Apps eller Microsofts Office 365), og de applikationer skal vedligeholdes de næste mange år. Samtidigt er der ikke noget, der tyder på, at webudvikling er på vej væk fra JavaScript, tværtimod. Produkter som Java Applets, Flash og Silverlight er mere eller mindre døde. Tilbage er applikationer kodet i HTML(5), CSS(3) og JavaScript.

Det er ikke blot i desktop- og mobil-browsere, man ser JavaScript i dag. Eksempelvis er sproget brugt til automatisering (Google Apps), det er benyttet ved udviklingen af brugerfladen i Windows 8, anvendt i hardware (Espruino-kortet), og node.js (JavaScript til serveren) bliver større og større for hver dag, der går. Så JavaScript er stort – kæmpe stort – og findes på næsten alle platforme, i næsten alle browsere, og en masse andre steder. Det er ikke uden grund kaldet verdens mest populære programmeringssprog, og det var med garanti ikke, hvad Brendan Eich havde forestillet sig for snart 20 år siden.

Grundet diverse fejl i sproget – samt ønsker om bedre syntaks, styring og kontrol – findes der en del projekter, som har til formål at hjælpe med at skrive JavaScript. Google har logisk nok en del investeret i JavaScript og har derfor projekter som Google Closure, Google Web Toolkit og det nye programmeringssprog Dart til at kontrollere, forbedre og skabe JavaScript, men preprocessorer som eksempelvis CoffeeScript og LiveScript er også meget populære. For et par år siden annoncerede Microsoft så deres bud på et værktøj til at skabe JavaScript. Et nyt sprog kaldet TypeScript. Dette sprog er i foråret 2014 frigivet i sin første version 1.0 og integreret i udviklingsmiljøet Visual Studio 2013 med Update 2. Sproget er frigivet som Open Source.

Dansker står bag

TypeScript er skabt af et team ledet af vores egen Anders Hejlsberg (står bag sprog som Turbo Pascal, Delphi, J++ og C#). Det er i modsætning til mange andre alternativer et såkaldt superset af JavaScript. Alt eksisterende JavaScript-kode er således allerede TypeScript og kan køres igennem kompileren uden ændringer overhovedet. TypeScript-kompileren har til formål at skabe JavaScript, der overholder ECMA3- eller ECMA5-standarden – men i kommende versioner vil man også kunne kompilere til ECMA6 (forventet ultimo 2014).

Det er altså et sprog baseret på JavaScript-syntaks med forskellige, valgfrie udvidelser og forbedringer, der gør det nemmere at udvikle og vedligeholde kode. Det betyder også, at egne eksisterende kodebaser samt samtlige JavaScript-frameworks (jQuery, Angular, Modenizr med videre) uden problemer kan benyttes. Til de fleste store frameworks kan man endda finde såkaldte definitionsfiler, og det gør brugen af disse frameworks meget effektiv i et udviklingsmiljø, fordi det får tilført en masse information om funktioner og typer.

Typestærkt JavaScript

En af JavaScript store styrker er, at det er typesvagt. Der angives således aldrig en type ved erklæring af variabler, og det giver en masse dynamiske muligheder. Men selv om det giver en masse muligheder, gør det også både udvikling og vedligeholdelse ret komplekst, fordi det ikke er muligt at få hjælp fra værktøjer og kompilere til at sikre, at eksempelvis variabler og argumenter benyttes korrekt.

Dette kan TypeScript rette op på, fordi det her er muligt at erklære variabler for primitive typer (string, number og bool) eller objekter med specificerede medlemmer. På den måde kan kompileren advare mod forkert tildeling af variabler eller forkerte kald til funktioner, og det giver en langt større sikkerhed i udviklingen. TypeScript giver også mulighed for at benytte et interface til at beskrive, hvilke medlemmer et konkret objekt skal bestå af eller signaturen på en funktion – igen en stor sikkerhed for at undgå stavefejl i variabelnavne, brug af forkerte typer, forkerte definitioner af funktioner og andre misforståelser.

TypeScript tilbyder sågar brugen af generics, som benyttes i mange andre programmeringssprog. Generics giver mulighed for at angive en type, som angives senere i forbindelse med en erklæring eller et metodekald, og det gør udviklingen af JavaScript endnu simplere og mere logisk.

Typeangivelsen (herunder generics) er kun en del af TypeScript. Når der kompileres til JavaScript forsvinder al type-information. Det er således udelukkende hjælp til udvikling og vedligeholdelse.

Sproget tilføjer ligeledes enumerations (samling af relaterede kontanter) til JavaScript. Igen for at gøre koden nem at udvikle, mere læsbar og nem at vedligeholde.

Klasser i JavaScript

En af JavaScripts helt store udfordringer er en alt for kompleks form for objektorienteret programmering. Det skyldes blandt andet, at sproget kun har virkefelter i funktioner, og at der benyttes prototyper i forbindelse med nedarvning. Det er absolut muligt at skabe store objekthierarkier, men det kræver en stor viden og erfaring, og det er svært at vedligeholde.

Derfor tilbyder TypeScript traditionelle klasser til simpel definition af objekter samt muligheden for at arve funktionalitet fra en superklasse. Det hjælper i den grad på både udvikling og vedligeholdelse af kode, fordi det så er muligt at indkapsle data og funktionalitet på en for mange udviklere logisk måde.

For at skabe klasser, konstruktører og nedarvning benytter TypeScript en syntaks, som det forventes den kommende version af ECMAScript også vil benytte (ECMA 6 forventes i slutningen af 2014), men indtil den er frigivet, vil TypeScript kompileren skabe ECMA3/5 JavaScript for at simulere funktionaliteten. TypeScript ændrer således ikke på nogen måde den prototypebaserede tilgang til objektorienteret kode, men gør blot syntaksen nemmere indtil JavaScript ”selv kan” i kommende versioner.

Moduler opdeler kode

Moduler er en af de features, der gør udvikling af kode langt mere sikker, fordi de giver mulighed for at separere og indkapsle funktionalitet. På den måde kan man nemmere vedligeholde og genbruge kode. Det har altid været muligt at simulere moduler i JavaScript ved at benytte forskellige designmønstre, men ligesom ved prototypebaseret nedarvning kan koden blive ret kompleks og dermed svær at vedligeholde.

Derfor introducerer TypeScript muligheden for at definere moduler ved hjælp af et modul-kodeord og gøre elementer i modulet tilgængelige ved hjælp af export-kodeordet. Samme syntaks forventes ECMA6 at benytte, men indtil da skaber TypeScript den relativ komplekse kode i forbindelse med kompilering.

Skal, skal ikke

JavaScript-udvikling er – utroligt nok set i lyset af sprogets design og historie – i rivende udvikling, og der er absolut ikke noget, der tyder på, at det ændrer sig i den umiddelbare fremtid. Som ansvarlig for projekter, der benytter JavaScript i stor stil (typisk store klientbaserede webapplikationer), har man med frigivelsen af TypeScript fået endnu et alternativ til effektiv JavaScript-udvikling og vedligeholdelse. Selv om TypeScript kan implementeres i mange forskellige udviklingsmiljøer, er det ikke den store overraskelse, at udvikling med TypeScript i Visual Studio er en helt forrygende oplevelse. Det er næsten som at skrive C#, hvilket ikke siger så lidt.

Om man vil tage chancen og basere en kommende udvikling på TypeScript i stedet for rå JavaScript, er en ret stor beslutning, men argumenterne er meget tiltalende: effektiv udvikling og vedligeholdelse, valgfri brug af typestærke features, automatisk og korrekt implementering af mønstre for moduler og klasser, kompileringscheck, brug af eksisterende kode og frameworks samt en stærk ”mor”, der ser ud til at ville hælde flere ressourcer i sproget.

Og skulle sproget mod forventning forsvinde om nogle år, står man i værste tilbage med fuldt gyldigt JavaScript. For mange vil det nok stå og falde med, hvorvidt man kan leve med at TypeScript er Microsoft – for er man allerede i Visual Studio, bliver det svært at komme uden om TypeScript i professionel JavaScript udvikling.

Se mere om TypeScript på www.typescriptlang.org eller på videoen fra Build 2013 (http://goo.gl/Sy6f6O), hvor den danske udvikler Anders Hejlsberg viser sit ”barn” frem.