Typescript, er det virkelig så godt?

Skrevet af
Nicky Christensen
Udgivet
Opdateret

Jeg har arbejdet med javascript og generelt udvikling i mange år. De seneste mange år er Javascript blevet et af de absolut mest populære programmeringssprog. og er kendt for at være det som er kaldet et “dynamically typed” sprog, hvilket betyder det ikke er et “type stærkt” sprog som f.eks C#. Det har der været delte meninger om, nogle har været glade for det, men der har også været mange der har set det som en svaghed i javascript, især indenfor de seneste år hvor der bliver flyttet mere og mere kritisk forretningslogik ud i klienten (browseren).

For at komme det til livs, er Microsoft blandt andet kommet med Typescript. Det kom til verdenen i 2012, og har siden hen virkelig fået vind i sejlene.

Typescript er kort fortalt et superset til javascript som gør det muligt at gøre javascript type stærkt. Koden der ender med at ligge ude i klienten (browseren) er dog stadig ikke type stærk. Det er det blot for de udviklere der arbejder med selve koden.

Fordelen ved Typescript er at det kan gøre ens kode mere stabil og pålidelig når man udvikler. Det gør det nemmere for andre udviklere at overtage en kodebase, såfremt de forstår Typescript vel og mærke, og dertil er der naturligvis også en række andre fordele.

Personligt er jeg ok glad for Typescript og bruger det i sammenhænge hvor det giver mening. Det giver bestemt nogle fordele som udvikler, og/eller for det team man udvikler sammen med, givet at alle naturligvis kan forstå at bruge Typescript.

Det lyder jo meget godt ik? Ja, som udgangspunkt er det rigtig godt, men det er ikke alt sammen “sunshine and rainbows”. For med alt godt, vil der også altid være noget mindre godt, hvilket leder mig hen til at skrive om at der altid er nogle overvejelser man gør gøre sig inden man vælger at benytte Typescript. Dem kommer jeg ind på nedenstående.

Disclaimer: Er du udvikler og bruger Typescript, er du nok allerede ved at få et føl over nedenstående overskrift. Men bær over med mig, og mon ikke det kunne være der var lidt om snakken nedenstående :)

Typescript øger kompleksitet

Det er måske en udtalelse jeg får høvl af fra mange udviklere, men uanset, så er der nu noget om snakken.

1: Typescript er endnu et lag af kompleksitet der skal ovenpå. Det betyder naturligvis også at det skal læres. Blot fordi man kan skrive godt javascript, er det desværre ikke en betydning med at man kan skrive Typescript. Det betyder naturligt også at kompleksiteten øges, da der skal læres endnu et “sprog”, og det kan ikke læres på en dag eller to.

2: Ved at benytte Typescript gør også at der er mere kode der skal skrives for at opnå det samme som tidligere. Det gør også at der er mere man som udvikler skal forholde sig til, hvilket også øger kompleksiteten en anelse.

Se blot nedenstående eksempel. Personligt selv (på trods af jeg er ok glad for typescript) syntes jeg eksemplet uden typescript er noget pænere end det eksempel med typescript.

Med Typescript

import React from 'react';
import ApolloClient from 'apollo-client';

export interface ApolloContextValue {
  client?: ApolloClient<object>;
  renderPromises?: Record<any, any>;
}

let apolloContext: React.Context<ApolloContextValue>;

export function getApolloContext() {
  if (!apolloContext) {
    apolloContext = React.createContext<ApolloContextValue>({});
  }
  return apolloContext;
}

export function resetApolloContext() {
  apolloContext = React.createContext<ApolloContextValue>({});
}

Uden Typescript

import React from 'react';
import ApolloClient from 'apollo-client';

let apolloContext;

export function getApolloContext() {
  if (!apolloContext) {
    apolloContext = React.createContext({});
  }
  return apolloContext;
}

export function resetApolloContext() {
  apolloContext = React.createContext({});
}

Benytter man Typescript skal man blandt andet forholde sig til at type sin kode, skrive Interfaces, benytte, Generics osv osv - Og ja, jeg vil godt medgive at for en person der arbejder og forstår Typescript, så er det ikke nødvendigvis meget mere komplekst. Virkeligheden er bare at det ikke er alle der er som dig, og husker du tilbage, så har det også taget tid på for dig at lære Typescript.

Der er så mange mennesker derude som er super skarpe til javascript som ikke er kommet i gang med Typescript endnu. Det gør desværre også at mange af disse personer blive fravalgt til stillinger, hvilket naturligt er brandærgerligt, da man som virksomhed kan gå glip af noget virkelig dygtig arbejdskraft. Der skal man som virksomhed være villig til at investere tiden i medarbejderen og få dem lært Typescript, hvis det i givet fald er sådan at organisationen er skruet sammen.

3: At opsætte et Typescript udviklingsmiljø er oftest en anelse mere komplekst end at opsætte et miljø uden. Eksempelvis skal man forholde sig til ting som: transpiling af TS filer, opsætning af ts-config, ts-lint og skal man skal benytte tredjeparts pakker fra NPM skal man finde ud af at installere de nødvendige typings for det bliver ordentligt understøttet i ens eget Typescript projekt. Alt i alt, den øget konfiguration øger naturligvis også kompleksiteten.

Derfor er det naturligt at man skal gøre sig nogle overvejelse inden man vælger at benytte det.

Her tænker jeg blandt andet på:

Teamet der skal arbejde på det forestående projekt, er det junior udviklere eller udviklere der ikke er super gode på scripting delen? Hvis svaret er ja, så er Typescript måske ikke den rette vej at gå.

Hvis der vælges Typescript blot fordi det er det nye “sort”, kan det vise sig at være den forkerte beslutning, både forretningsmæssigt og strategisk. Kig på projektet, kunden, budgettet, teamet, og beslut først derefter om Typescript er det korrekte at benytte.

Det kan også være at teamet er super dygtige til javascript, men aldrig har benyttet Typescript. Så kræver det noget oplæring, og hvem skal betale for det… Kunden? Den kan være svær at sælge ind, og er det også fair at kunden skal betale for oplæring af udviklerne?

Hvordan gør i det mon i jeres organisation, det vil jeg gerne høre mere om?

At lære Typescript er ikke “rocket-science”, men der er en naturlig læringskurve som ved alle andre kodesprog og det tager noget tid for at man er inde i hvordan det virker. Selvom jeg har benyttet det i noget tid nu, betragter jeg mig ikke ikke som ekspert i det, langt fra faktisk. Jeg forstår det, og jeg kan bruge det.

Til slut, så vil jeg også nævne at øget kompleksitet giver mindre tid til at være produktiv, hvilket kan gå ud over kunden: Tidsforbruget bliver som regel større, hvilket også fordyrer projektet. Det kommer jeg lidt nærmere på nedenstående.

Typescript kan gør projektet dyrere

Som jeg nævnte i ovenstående afsnit, så kræver Typescript mere kode end hvis man blot skrev almindelig Javascript. Det så du også i kode eksemplet fra tidligere.

Det gør naturligvis også det at det “oftest” tager længere tid at skrive koden. Nu satte jeg “oftest” i anførselstegn, og det er der en helt bestemt grund til. For alt efter kompleksiteten af hele projektet kan Typescript godt spare dig en tid. Hvordan hænger det sammen med min påstand om at du skal skrive mere kode?

Jamen ser du, når man har et stort projekt, typisk enterprise projekter med masser af kompleksitet kan der være mange steder hvor der kan ske bugs og forskellige ‘side-effects’.

Det kan tage lang tid at lave bugfixing, især på større projekter. Her kan det være rigtig godt givet ud af have benyttet Typescript, også selvom projektet måske tager det længere at udføre. I mange henseender kan man indhente den tid på undgået bugfixing. Jeg vil dog stadig påstå at det i det fleste tilfælde kun er på større og komplekse projekter.

Dette leder mig også til at nævne at man naturligvis skal overveje hvornår man skal benytte Typescript. Som nævnt, på større projekter giver det god mening, men på mindre projekter hvor der ikke er meget kompleksitet, er det måske et overkill.

Det er også værd at bemærke at man bør have “kunden” i tankerne her. Hvornår får kunden mest værdi for pengene. Laver man et projekt der ikke indeholder meget kompleksitet, kan det være bedre for kunden at Typescript ikke bliver benyttet, og man i stedet holder fokus på ting der giver mere værdi for dem, end for dem som udvikler det. Samtidig handler det også meget om det team der skal arbejde på projektet. Er erfaringen minimal med Typescript vil det givetvis tage betragteligt længere tid at udvikle projektet, og er det rimeligt at kunden skal betale for det fordi du/i som organisation har valgt det skal være sådan?

Typescript minimerer IKKE testing

Du skal stadig teste din kode og applikation lige så meget som tidligere. Selvom man bruger Typescript, slipper man altså ikke for at teste sin applikation mindre end tidligere.

Selvom TypeScript fanger nogle fejl under udvikling, er de fejl man fanger normalt ret trivielle (som ved fx: et tal, hvor en funktion forventer en streng) og kan generelt fanges af en erfaren udvikler alligevel. Ift mere komplicerede forhold såsom: race conditions, memory leaks osv. er TypeScript egentlig en smule ubrugelig. Derfor, har du stadig har brug for at skrive de samme tests (hvis man benytter automatiseret tests) og/eller bruge den samme tid på fejlfinding og test af koden og generelt hele applikationen.

Hvorfor så bruge Typescript?

Nu har jeg jo været inde på nogle af de ulemper og overvejelser man bør gøre sig inden man benytter Typescript, så hvorfor bør man så bruge Typescript?

Typings Ved at benytte typings gør det koden mere forudsigelig og mere læselig (til tider). Forestil dig en funktion der tager imod en parameter. I ren Javascript kan du ikke se hvilken type af parameter funktionen tager imod (string, boolean, array, object osv), men i typescript kan du nemt definere det, og dermed også hurtigt spotte det i koden.

Bugs bliver fanget tidligere Oftest vil du mange flere potentielle fejl i din kode, og du fanger dem langt tidligere end du ville have gjort uden Typescript. Kodebasen bliver mere forudsigelig Ved at benytte Typescript får du en mere forudsigelig kodebase. Fx hvis en variabel er deklareret som en “string”, vil det forblive sådan.

Kodebasen bliver renere Ved at benytte Typescript får man også oftere en renere kode (Det som udviklere tit referere til som “clean code”). Det har den positive fordel i at man som udvikler sørge for at holde sin funktioner mv letlæselige.

Udviklere får mere ro i maven Det giver en vis ro i maven på mange udviklere når der benyttes Typescript. Det er blandt andet fordi det giver en vis sikkerhed i mange tilfælde når Typescript benyttes. Blandt andet fordi man er sikker på man fanger fejl hvis en funktion kaldes med forkerte parametre.

God IDE support Hvis du som mig benytter Webstorm eller VSCode vil du opleve at din IDE oplevelse bliver markant bedre. Du får forbedret intellisense hvilket er med til at hjælpe dig markant når man udvikler. Øget effektivitet, givet alle kender Typescript Har du et team hvor alle kender og er vant til at arbejde med Typescript vil man kunne se en øget effektivitet. Dette er ofte grundet mindre bugs og side effects når flere udviklere arbejder på samme projekt. It just works som man siger!

Der er selvfølgelig flere fordele, men dette var blot for at nævne nogle af de fordele du får ved at benytte Typescript.

For at konkludere denne efterhånden lange artikel, så ja, Typescript er rigtig godt og et værktøj der kan understøtte og hjælpe udviklere og teams, men det kommer som nævnt også med nogle ulemper (Som så meget andet) og overvejelse som man bør gøre sig inden man blot vælger at bruge det på et projekt.

Analyser casen inden igangsættelse. Indeholder projektet meget kompleks funktionalitet? Er projektet af den nødvendige størrelse? Giver det mening for kunden, eller vælger du at benytte blot for din egen skyld? Giver det kunden den nødvendige værdi? Kender alle på teamet til Typescript? Du skal ikke bruge det, bare for at bruge det. Se på kunden, behovet, krav, kompleksitet osv, og evaluer derefter om det er noget der skal bruges.

Jeg vil mene der er mange overvejelser man bør gøre sig inden man blindt vælger at benytte Typescript, og ovenstående er nogle af disse tanker.

__Jeg får nok lidt hug fra nogle, da det er et ømtåleligt emne for mange udviklere. Nogle sværger til det, andre er lidt uden mening, og nogle udviklere kan slet ikke fordrage Typescript. __

Uanset mening, så har jeg i hvert fald kastet mine tanker op, og del meget gerne dine egne tanker. Jeg er altid åben for en konstruktiv dialog om for og imod :)

Er du udvikler og læser dette, så er du muligvis uenig og sværger til at lave alt i Typescript, og det er skam også fair nok, og mit eget udvikler hjerte er også nogenlunde glad for Typescript, men man kan ikke komme udenom at ovenstående “problemstillinger” er virkelige og bør derfor tages med i overvejelserne når man begiver sig ud i et nyt projekt.

Uanset mening og stærke holdninger, så har jeg i hvert fald kastet mine tanker op. Del gerne dine med mig, jeg er altid åben for en konstruktiv dialog og hører gerne om jeres valg og hvorfor :)