sandra-larsson
Educator Fullstack Developer Javascript at Chas Academy
FJS26 · V49 · TISDAG
Flytta felen från när koden körs till när du skriver den.
Chas Academy · Tisdag 1 december 2026
VARFÖR?
Värdet får sin typ när koden körs. '10' är en sträng och 10 är ett tal, och en variabel kan byta typ när som helst.
let price = 39; price = 'gratis'; // inga problem
Typen bestäms när koden skrivs, och kontrolleras innan den körs.
let price = 39; price = 'gratis'; // Type 'string' is not assignable // to type 'number'.
JavaScript med typer. Ett språk som kompileras till vanlig JavaScript, och som webbläsaren aldrig ser.
VARFÖR?
Alla tre körs utan varning i JavaScript. TypeScript säger ifrån innan du har sparat filen.
const quantity = input.value; // '2' const total = quantity * 39;
product.prise; // undefined, utan fel
formatPrice('39');
// TypeError: price.toFixed
// is not a functionVARFÖR?
Från när användaren kör appen till när du skriver koden. undefined upptäcks i editorn, inte i produktion.
Autocomplete som vet vilka egenskaper som finns, och röda streck direkt när något är fel.
add(a: number, b: number): number säger vad funktionen tar och ger, utan att du läser koden.
VARFÖR?
Typer för parametrar, objekt och data utifrån. Men TypeScript räknar ut mycket själv.
Koden måste kontrolleras och byggas. Med Vite märks det knappt.
Typerna finns bara medan du skriver. Data från ett API kan fortfarande vara fel. Det tar vi i morgon och nästa vecka.
PROJEKTET
Mallen vanilla-ts i stället för vanilla.
npm create vite@latest mitt-projekt -- --template vanilla-tsnpm install -D typescript@~6.0.3: Vite installerar TypeScript 7, men typescript-eslint stöder än så länge bara upp till 6.0.npm install -D eslint @eslint/js typescript-eslintERESOLVE could not resolve på den tredje. Använd inte --force.PROJEKTET
TypeScript-kompilatorn. Kontrollerar typerna. I Vite-mallen bygger den ingenting (noEmit).
Tar bort typerna och bygger JavaScript. npm run dev kontrollerar inga typer.
Hittar dålig kod, till exempel any och oanvända variabler. Med typescript-eslint förstår den TypeScript.
PROJEKTET
Ett urval av det Vite-mallen ger.
{
"compilerOptions": {
"target": "es2023",
"lib": ["ES2023", "DOM"],
"moduleResolution": "bundler",
"noEmit": true,
"noUnusedLocals": true,
"noUnusedParameters": true
},
"include": ["src"]
}Det står ingenstans. Sedan TypeScript 6 är strict på som standard. Då kontrolleras bland annat null och undefined, och en parameter utan typ blir ett fel i stället för any.
GRUNDTYPER
const cafe = 'Kaféet'; // 'Kaféet' let guests = 12; // number
let rating: number; const isOpen: boolean = true;
GRUNDTYPER
string // 'hej', '' number // 0, 39, -4.5 boolean // true, false
null undefined let note: string | null = null;
any // allt är tillåtet, // inget kontrolleras
any stänger av TypeScript. Det kompilerar, och sedan kraschar det ändå.
ARRAYER
const prices = [39, 49, 29]; // number[]
prices.push('gratis');
// Argument of type 'string' is not
// assignable to parameter of type 'number'.const names: string[] = [];
names.push('Ada', 'Grace');FUNKTIONER
const sum = (numbers: number[]): number => numbers.reduce((total, n) => total + n, 0);
TypeScript räknar ut den, men skriver du den hamnar felet i funktionen och inte där den anropas.
const logPrice = (price: number): void => {
console.log(price);
};FUNKTIONER
const greet = (name: string, greeting?: string) =>
`${greeting ?? 'Hej'}, ${name}!`;
// greeting: string | undefinedconst greet = (name: string, greeting = 'Hej') =>
`${greeting}, ${name}!`;
// greeting: stringOBJEKT
type Product = {
readonly id: string;
name: string;
price: number;
category?: string;
};const bun: Product = {
id: 'bulle',
name: 'Kanelbulle',
price: 35,
};
bun.id = 'bulle2';
// Cannot assign to 'id' because
// it is a read-only property.OBJEKT
interface Customer {
name: string;
email: string;
}
interface Member extends Customer {
memberSince: number;
}För objekt gör de nästan samma sak. interface kan utökas med extends. type kan också beskriva unions, som vi tar i morgon. Välj ett och var konsekvent i projektet.
OBJEKT
const formatProduct = (product: Product): string =>
`${product.name}: ${product.price} kr`;formatProduct({ id: 'te', name: 'Te',
price: 29, color: 'grön' });
// Object literal may only specify known
// properties, and 'color' does not exist
// in type 'Product'.EFTER PASSET
By sandra-larsson