Komplett nybegynnerguide til TypeScript: typer, interfaces, generics og integrasjon med React og Node. Lær type-sikker kode steg for steg.

Innhold i artikkelen (7)
  1. Hva er TypeScript og hvorfor bruke det?
  2. Grunnleggende typer — byggesteinene i TypeScript
  3. Interfaces og Type Aliases — slik strukturerer du data
  4. Generics — gjenbrukbar type-sikker kode
  5. TypeScript i praksis — med React og Node.js
  6. Union-typer, type guards og utility types
  7. Kom i gang med TypeScript i dag

Hva er TypeScript og hvorfor bruke det?

TypeScript er et programmeringsspråk utviklet av Microsoft som bygger på JavaScript ved å legge til statisk typing. Ifølge TypeScript-dokumentasjonen er eksisterende, fungerende JavaScript-kode også TypeScript-kode, og TypeScript legger typesystemet som et ekstra lag oppå. Koden typesjekkes av kompilatoren tsc og blir til vanlig JavaScript som kan kjøre i nettlesere og på Node.js. Kildekoden ligger åpent på GitHub.

Hvorfor TypeScript? Den viktigste fordelen er at mange feil oppdages før koden kjøres, i editoren din, fremfor i produksjon. Prøver du å sende en string inn i en funksjon som forventer et tall, gir TypeScript en feilmelding med en gang. Autofullføring i VS Code blir bedre fordi editoren vet hvilke egenskaper og metoder objektene dine har. For store kodebaser og team gjør typene koden enklere å vedlikeholde over tid.

TypeScript gir JavaScript den statiske typingen som mangler — og gjør det mulig å oppdage feil…
TypeScript gir JavaScript den statiske typingen som mangler — og gjør det mulig å oppdage feil allerede i editoren, ikke i produksjon.

Grunnleggende typer — byggesteinene i TypeScript

De tre vanligste primitive typene er string, number og boolean. I tillegg finnes blant annet null, undefined, symbol og bigint. Du kan annotere variabler, funksjonsparametere og returverdier med typene. TypeScript kan også utlede typer automatisk (type inference): skriver du let navn = "Kari";, utleder TypeScript at navn er en string, så du trenger ikke alltid å skrive typen eksplisitt.

Eksempler på typeannoteringer: let alder: number = 28; — let navn: string = "Kari"; — let aktiv: boolean = true;. Funksjoner: function leggSammen(a: number, b: number): number { return a + b; }. TypeScript gir feilmelding hvis du prøver å kalle leggSammen("hei", 2).

Arrays skrives som number[] eller Array<number>. Tuples er arrays med fast lengde og typer per posisjon: [string, number] — f.eks. ["Kari", 28]. any-typen skrur av typesjekkingen for en verdi, så bruk den sparsomt. unknown er tryggere: du må innsnevre typen før du bruker verdien.

Annonse

Interfaces og Type Aliases — slik strukturerer du data

Interface beskriver formen til et objekt. Du definerer hvilke felter objektet skal ha og hvilken type hvert felt har. Eksempel: interface Bruker { id: number; navn: string; epost: string; aktiv: boolean; }. Alle objekter som tilfredsstiller denne formen er gyldige Bruker-objekter.

Type alias er en annen syntaks for å definere typer: type Bruker = { id: number; navn: string; }. For enkle objekter fungerer interface og type alias nesten likt. Ifølge håndboken er den viktigste forskjellen at en type ikke kan åpnes på nytt for å legge til felter, mens et interface alltid kan utvides. Interfaces utvides med extends, mens type aliases bruker intersection (&). Type aliases kan i tillegg gi navn til union-typer og primitive typer.

Valgfrie felter markeres med spørsmålstegn: interface Produkt { id: number; navn: string; beskrivelse?: string; }. Readonly-felter kan ikke endres etter at objektet er opprettet: interface Konfig { readonly apiUrl: string; }. En vanlig tommelfingerregel: bruk interface for objekter og type for unions, tuples og andre sammensatte typer.

Generics — gjenbrukbar type-sikker kode

Generics lar deg skrive gjenbrukbar kode som fungerer med mange typer uten å miste typesikkerhet (håndboken om generics). Tenk på generics som type-parametere: akkurat som en funksjon tar verdiparametere, tar en generisk funksjon type-parametere.

Eksempel: function sisteElement<T>(arr: T[]): T { return arr[arr.length - 1]; }. Her er T en type-parameter. Kall sisteElement([1, 2, 3]) gir number, og sisteElement(["a", "b"]) gir string. Uten generics måtte du enten skrive én funksjon per type, eller bruke any og miste typesjekkingen.

Generics brukes mye i biblioteker: useState<number>(0) i React spesifiserer at staten er et tall (react.dev). Promise<string> beskriver et løfte som gir en streng. Array<T>, Map<K, V> og Set<T> er innebygde generiske typer. Du kan også sette krav til type-parameteren med extends: function hentNavn<T extends { navn: string }>(obj: T): string { return obj.navn; } — T må ha et navn-felt.

Annonse

TypeScript i praksis — med React og Node.js

For React: React-dokumentasjonen viser at du legger til typene i et eksisterende prosjekt med npm install --save-dev @types/react @types/react-dom, og at filer med JSX må ha filendelsen .tsx (react.dev). For nye prosjekter gir Vite ferdige maler: npm create vite@latest my-app -- --template react-ts. Create React App er avviklet for nye prosjekter (React-bloggen). En komponent med props kan skrives slik: interface Props { tittel: string; antall: number; onClick: () => void; } og function MinKomponent({ tittel, antall, onClick }: Props) { ... }.

For Node.js: installer TypeScript lokalt i prosjektet med npm install -D typescript, kjør npx tsc --init for å lage tsconfig.json, og kompiler med npx tsc. Dette er også installasjonsmåten Microsoft viser i kunngjøringen av TypeScript 7.0. I TypeScript 7 er types satt til en tom liste som standard, så vil du ha Node-typene må du installere @types/node og skrive "types": ["node"] i tsconfig.json. Node.js kan dessuten kjøre .ts-filer direkte ved å fjerne typeannotasjonene (type stripping), som er stabilt fra v24.12.0 og v25.2.0. Det gjør ingen typesjekking, så du kjører fortsatt tsc for det, og enums støttes ikke (Node.js-dokumentasjonen).

tsconfig.json er TypeScripts konfigurasjonsfil. De viktigste innstillingene er strict (strenge sjekker, slått på som standard fra TypeScript 7), target (hvilken JavaScript-versjon du kompilerer til), module (hvilket modulsystem som brukes) og paths (alias for import-stier).

Union-typer, type guards og utility types

Union-typer lar en verdi være én av flere typer (håndboken): type Status = "aktiv" | "inaktiv" | "slettet". Dette er sikrere enn å bruke string, fordi TypeScript vet nøyaktig hvilke verdier som er gyldige. Discriminated unions er et nyttig mønster: type Respons = { status: "ok"; data: string } | { status: "feil"; melding: string }. Du kan bruke switch på status-feltet, og TypeScript vet hvilke felter som er tilgjengelige i hvert tilfelle (håndboken om narrowing).

Type guards innsnevrer typen i et kodesteg. Egne type guards skrives med type predicates: function erString(val: unknown): val is string { return typeof val === "string"; }. Utility types er innebygde generiske hjelpere: Partial<T> gjør alle felter valgfrie, Required<T> gjør alle felter obligatoriske, Readonly<T> gjør alle felter skrivebeskyttet, Pick<T, K> velger ut felter, og Omit<T, K> fjerner felter.

Record<K, V> er nyttig for oppslagstabeller: type Landkoder = Record<string, string>. ReturnType<typeof minFunksjon> gir deg typen en funksjon returnerer, uten at du må skrive den manuelt. Utility types reduserer duplisering og holder typedefinisjonene i synk med kilden.

Kom i gang med TypeScript i dag

Kom i gang steg for steg: legg TypeScript til i et eksisterende JavaScript-prosjekt med npm install -D typescript og npx tsc --init. Gi .js-filene filendelsen .ts én om gangen. Fra og med TypeScript 7 er strict slått på som standard (kunngjøringen av TypeScript 7.0). Når du flytter et eldre prosjekt over, kan du slå av enkelte sjekker midlertidig i tsconfig.json og skru dem på igjen etter hvert.

Et godt sted å begynne er TypeScript-dokumentasjonen på typescriptlang.org, spesielt veiledningen «TypeScript for JavaScript Programmers». Unngå any, skriv ut typene dine der inferensen ikke strekker til, og la kompilatoren hjelpe deg.

Annonse

Emner

Olav Sie Rotvær
Skrevet avOlav Sie RotværSkribent og utvikler

Olav Sie Rotvær skriver og drifter Norsk Næring. Han er utvikler, ikke journalist, og har ingen fagutdanning innenfor teknologi & innovasjon. Artiklene bygger derfor på primærkilder som oppgis der påstanden gjøres.

Om forfatteren og hvordan artiklene kildebelegges →