Kom igång med TypeScript 2026 — typer, interfaces, generics, enums, utility types, tsconfig, strict mode och VSCode-integration.
TypeScript har 2026 gått från ett alternativ till standarden för JavaScript-utveckling. Oavsett om du bygger backend med Node.js, frontend med React eller fullstack med Next.js är TypeScript det första valet för seriösa projekt. Typ systemet fångar fel vid kompilering istället för vid körning, ger utmärkt IDE-support med autocomplete och refactoring, och gör koden självdokumenterande.
Den här guiden tar dig från grundläggande typer till avancerade mönster i TypeScript 5.x (2026). Du lär dig interfaces, types, generics, enums, utility types, type narrowing, declaration files, och hur du migrerar ett befintligt JavaScript-projekt till TypeScript. Alla exempel är praktiska och direkt användbara i dina projekt.
Installera och konfigurera TypeScript
Börja med att installera TypeScript i ditt projekt:
| 1 | npm install -D typescript @types/node |
| 2 | npx tsc --init |
Det sista kommandot skapar en tsconfig.json med standardinställningar. För ett nytt projekt 2026 rekommenderar jag följande konfiguration:
| 1 | { |
| 2 | "compilerOptions": { |
| 3 | "target": "ES2024", |
| 4 | "module": "ESNext", |
| 5 | "moduleResolution": "bundler", |
| 6 | "strict": true, |
| 7 | "esModuleInterop": true, |
| 8 | "skipLibCheck": true, |
| 9 | "forceConsistentCasingInFileNames": true, |
| 10 | "outDir": "./dist", |
| 11 | "rootDir": "./src" |
| 12 | }, |
| 13 | "include": ["src"] |
| 14 | } |
Nyckeln är strict: true — det aktiverar alla strikta typkontroller som gör TypeScript verkligen användbart. Utan strict mode missar du många av fördelarna med TypeScript.
Grundläggande typer
TypeScript utökar JavaScript med ett typsystem som kan uttrycka allt från enkla primitives till komplexa datastrukturer. De grundläggande typerna är:
| 1 | let name: string = "Simon" |
| 2 | let age: number = 42 |
| 3 | let isActive: boolean = true |
| 4 | let data: null = null |
| 5 | let id: undefined = undefined |
| 6 | let anything: any = "kan vara vad som helst" // undvik |
| 7 | let unknown: unknown = "måste kollas före användning" |
| 8 | let numbers: number[] = [1, 2, 3] |
| 9 | let tuple: [string, number] = ["Simon", 42] |
| 10 | enum Color { Red, Green, Blue } |
| 11 | let c: Color = Color.Green |
any stänger av typkontroll helt — använd det bara som sista utväg vid migrering från JavaScript. unknown är ett typesäkert alternativ till any — du måste kontrollera typen innan du använder värdet.
Interfaces och types
Interfaces och type aliases låter dig definiera anpassade typer. Interfaces används främst för objektstrukturer och kan extendas (utökas). Type aliases är mer flexibla och kan representera unions, intersections och primitiva typer:
| 1 | interface User { |
| 2 | id: string |
| 3 | name: string |
| 4 | email: string |
| 5 | role: "admin" | "editor" | "viewer" |
| 6 | createdAt: Date |
| 7 | } |
| 8 | |
| 9 | type Status = "active" | "inactive" | "pending" |
| 10 | type ApiResponse<T> = { |
| 11 | data: T |
| 12 | error: string | null |
| 13 | status: number |
| 14 | } |
| 15 | |
| 16 | interface AdminUser extends User { |
| 17 | permissions: string[] |
| 18 | } |
Skillnaden mellan interface och type är subtil 2026. Interfaces är ofta att föredra för objekttyper eftersom de ger bättre felmeddelanden och kan deklareras flera gånger (de mergas automatiskt). Type aliases är bättre för unions, intersection och generiska hjälptyper.
Generics — återanvändbara typer
Generics låter dig skapa återanvändbara komponenter som fungerar med flera typer. De är en av TypeScripts mest kraftfulla funktioner:
| 1 | function firstElement<T>(arr: T[]): T | undefined { |
| 2 | return arr[0] |
| 3 | } |
| 4 | |
| 5 | const first = firstElement([1, 2, 3]) // typ: number | undefined |
| 6 | const str = firstElement(["a", "b"]) // typ: string | undefined |
| 7 | |
| 8 | // Flera typparametrar |
| 9 | function pair<A, B>(a: A, b: B): [A, B] { |
| 10 | return [a, b] |
| 11 | } |
| 12 | |
| 13 | // Begransningar med extends |
| 14 | function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { |
| 15 | return obj[key] |
| 16 | } |
Använd generics för att skapa flexibla, typsäkra funktioner och komponenter. TypeScript sluter automatiskt typparametrar från användningen, så du behöver sällan specificera dem explicit.
Enums — namngivna konstanter
Enums låter dig definiera en uppsättning namngivna konstanter som är lätta att referera till i kod. TypeScript har både numeriska och sträng-baserade enums:
| 1 | enum HttpStatus { |
| 2 | OK = 200, |
| 3 | Created = 201, |
| 4 | BadRequest = 400, |
| 5 | Unauthorized = 401, |
| 6 | NotFound = 404, |
| 7 | InternalServerError = 500, |
| 8 | } |
| 9 | |
| 10 | enum Direction { |
| 11 | Up = "UP", |
| 12 | Down = "DOWN", |
| 13 | Left = "LEFT", |
| 14 | Right = "RIGHT", |
| 15 | } |
2026 är const enums (med const enum) populära för prestanda — de kompileras bort helt och ersätts med sina värden. För de flesta fall räcker dock vanliga enums eller as const-objekt.
Utility types — inbyggda hjälptyper
TypeScript har ett rikt bibliotek av inbyggda utility types som gör typmanipulation enkel. De viktigaste är:
| 1 | interface User { |
| 2 | id: string |
| 3 | name: string |
| 4 | email: string |
| 5 | age?: number |
| 6 | } |
| 7 | |
| 8 | // Partial: alla falt blir valfria |
| 9 | type PartialUser = Partial<User> |
| 10 | |
| 11 | // Required: alla falt blir obligatoriska |
| 12 | type RequiredUser = Required<User> |
| 13 | |
| 14 | // Pick: valj ut specifika falt |
| 15 | type UserName = Pick<User, "id" | "name"> |
| 16 | |
| 17 | // Omit: exkludera specifika falt |
| 18 | type UserWithoutEmail = Omit<User, "email"> |
| 19 | |
| 20 | // Readonly: alla falt blir readonly |
| 21 | type ReadonlyUser = Readonly<User> |
| 22 | |
| 23 | // Record: nyckel-varde-par |
| 24 | type UserMap = Record<string, User> |
| 25 | |
| 26 | // ReturnType: harled returtypen fran en funktion |
| 27 | type ApiResult = ReturnType<typeof fetchData> |
Dessa utility types kombineras ofta för att skapa precisa typer utan att duplicera kod. Använd dem för att härleda typer från befintliga strukturer istället för att definiera allt manuellt.
Type narrowing — smalna av typer
Type narrowing är tekniken att genom villkor stegvis smalna av en bred typ till en mer specifik. Det är centralt för att arbeta med unionstyper:
| 1 | function processValue(value: string | number | Date) { |
| 2 | if (typeof value === "string") { |
| 3 | // har ar value av typen string |
| 4 | return value.toUpperCase() |
| 5 | } |
| 6 | if (value instanceof Date) { |
| 7 | // har ar value av typen Date |
| 8 | return value.getFullYear() |
| 9 | } |
| 10 | // har ar value av typen number |
| 11 | return value.toFixed(2) |
| 12 | } |
| 13 | |
| 14 | // Type guards: anpassad narrowing |
| 15 | function isAdmin(user: User): user is AdminUser { |
| 16 | return user.role === "admin" |
| 17 | } |
| 18 | |
| 19 | function handleUser(user: User) { |
| 20 | if (isAdmin(user)) { |
| 21 | // har ar user av typen AdminUser |
| 22 | return user.permissions |
| 23 | } |
| 24 | } |
TypeScript är skickligt på att automatiskt smalna av typer baserat på typeof, instanceof, in, och diskriminerade unioner (en gemensam egenskap med literal-typ). Använd type guards när automatisk narrowing inte räcker.
Declaration files — typa JavaScript-bibliotek
Declaration files (.d.ts) beskriver typerna för JavaScript-bibliotek som inte är skrivna i TypeScript. Många populära bibliotek har färdiga typer via DefinitelyTyped (@types/-paket). Installera med:
| 1 | npm install -D @types/express @types/lodash @types/node |
Om ett bibliotek saknar typer kan du skriva en egen declaration file. Skapa types.d.ts i ditt projekt:
| 1 | declare module "mitt-bibliotek" { |
| 2 | export function doSomething(input: string): Promise<Result> |
| 3 | export interface Result { |
| 4 | success: boolean |
| 5 | data: unknown |
| 6 | } |
| 7 | } |
Declaration files används också för att utöka globala typer, som att lägga till egna miljövariabler på process.env eller utöka Window-gränssnittet.
tsconfig — konfigurera TypeScript-kompilatorn
tsconfig.json styr hur TypeScript kompileras. De viktigaste inställningarna 2026 är:
strict: true— aktiverar alla strikta kontroller. Detta är standard för nya projekt och rekommenderas starkt.target: "ES2024"— vilken ECMAScript-version som kompileras till. ES2024 har stöd för de senaste funktionerna.module: "ESNext"eller"NodeNext"— modulsystem. ESNext för frontend, NodeNext för Node.js.moduleResolution: "bundler"— fungerar med de flesta moderna byggverktyg (Vite, webpack, Turbopack).paths— sökvägsalias som@/components/*för renare importer.excludeochinclude— vilka filer som ska kompileras.
Undvik att använda strict: false eller att sätta individuella strict-flagg till false — du förlorar då de viktigaste fördelarna med TypeScript.
Migrera från JavaScript till TypeScript
Att migrera ett befintligt JavaScript-projekt till TypeScript görs bäst stegvis. Börja med att:
- Lägg till TypeScript och en grundläggande tsconfig.json med
allowJs: trueochcheckJs: false. - Byt filändelse på en fil i taget från
.jstill.tsoch åtgärda typfel. - Använd
// @ts-ignoreelleranysom temporär lösning för komplexa delar. - Skriv typdefinitioner för kritiska datastrukturer först.
- Aktivera
strict: truenär alla filer är migrerade.
Det viktigaste är att inte försöka migrera allt på en gång. Migrera de mest använda eller mest buggbenägna delarna först. Använd strict: false initialt och aktivera strikta kontroller gradvis. En lyckad migrering tar veckor till månader, inte dagar.
VSCode-integration — produktivitetstips
Visual Studio Code har den bästa TypeScript-integrationen av alla editorer 2026. Några tips för maximal produktivitet: använd Cmd+. (macOS) / Ctrl+. (Windows) för snabbåtkomst till TypeScript-förslag som "Add missing import" och "Extract to type". Använd Cmd+Shift+O för att navigera till symboler i filen.
Aktivera "typescript.suggest.autoImports": true för automatisk import, och "typescript.updateImportsOnFileMove.enabled": "always" för att automatiskt uppdatera sökvägar när du flyttar filer. För mer avancerad analys, använd TypeScript Language Service Plugins för att lägga till linting-regler direkt i editorn.
Sammanfattning
TypeScript ger dig typsäkerhet, bättre verktygsstöd och självdokumenterande kod utan att kompromissa med JavaScripts flexibilitet. 2026 är TypeScript standard för all seriös JavaScript-utveckling — från backend till frontend, från små projekt till stora företagsapplikationer. Du har nu lärt dig grunderna: typer, interfaces, generics, enums, utility types, type narrowing och migrering. Nästa steg är att tillämpa detta i ett riktigt projekt och upptäcka hur mycket produktivare typsäker utveckling är.
“TypeScript gör JavaScript till ett seriöst språk för storskalig utveckling — typsäkerhet utan att kompromissa med flexibilitet.”
- Simon Axelsson
Vanliga frågor
- Är TypeScript värt besväret för små projekt?
- Ja, även för små projekt. TypeScript fångar typfel tidigt, ger bättre autocomplete och gör koden lättare att förstå när du återvänder till den efter några veckor. För projekt under 500 rader kan ren JavaScript vara okej, men för allt större rekommenderar jag TypeScript. Kostnaden är marginell jämfört med nyttan.
- Vad är skillnaden mellan interface och type?
- Interfaces kan extendas (är öppna för deklaration merging) och ger ofta bättre felmeddelanden. Type aliases är mer flexibla — de kan representera unions, intersection och primitiva typer. 2026 rekommenderas interfaces för objekttyper och type för allt annat. Båda fungerar utmärkt, och du kan blanda dem fritt.
- Hur hanterar TypeScript runtime-fel om typerna är korrekta?
- TypeScripts typsystem är ett utvecklingstidsverktyg — det existerar inte vid runtime. Därför kan runtime-fel fortfarande uppstå från felaktig data från API:er, användarinput eller tredjepartsbibliotek. Använd runtime-validering (Zod, Yup) för data vid systemgränser (API-anrop, formulär, filinläsning) för att kombinera TypesScripts statiska typer med runtime-säkerhet.
- Ska jag använda enums eller const-objekt med as const?
- Båda fungerar, men <code>as const</code>-objekt är att föredra 2026. De ger dig samma typ-säkerhet som enums men kompileras till enklare JavaScript och är lättare att arbeta med i mönster som discriminated unions. Enums är bättre när du behöver numeriska värden eller reverse mapping (hitta namnet från värdet).
- Hur uppgraderar jag TypeScript i ett befintligt projekt?
- Använd <code>npm install -D typescript@latest</code> för att uppgradera. Efter uppgradering kör <code>npx tsc</code> för att se om nya fel dyker upp. TypeScript 5.x har få breaking changes mellan minor-versioner. Kontrollera changelog för att se om några inställningar ändrats. De flesta projekt uppgraderas utan problem.
