Javascript intepreteraren (eller JIT) tilldelar värdet en datatyp vid runtime. En "10" blir en string och 10 blir ett Number. Och programmeraren kan sedan typomvandla vid behov.
Motsvarigheten heter statisk typning och där måste programmeraren explicit ange datatyp som string, int, osv. Så är fallet i programmeringspråk som C++, C#, Java, etc
1. Flytta felen från runtime till compile time, vilket minskar risken att skicka ut felen i "verkligheten". Exempelvis upptäcka "undefined" vid utveckling istället för körning av applikationen.
2. Mer kontroll i utvecklingsmiljön. D.v.s genom att ange typer får vi direkt feedback om vi skriver fel i vår kod. TS har bättre autocomplete där typer angetts.
3. Bättre "dokumentation" eftersom det lämnar intentionerna i koden mer tydligt.
function add(a, b) {
return a + b
}
Nästa utvecklare tar vid och undrar är det string, number eller båda?
3. Bättre "dokumentation" eftersom det lämnar intentionerna i koden mer tydligt.
function add(a: number, b: number): number {
return a + b;
}
add(3, "4") // Fel
npm init
npm install typescript --save-dev
npx tsc --init // skapar tsconfig.json
npx tsc // bygger om .ts => .js
Man behöver inte köra npx, utan kan köra endast tsc men då pekar den på den globala versionen. Olika projekt kan behöva olika versioner. https://www.typescriptlang.org/download
package.json # Package manifest
tsconfig.json # TypeScript kompileringsinställningar
src/index.ts # "programmet"
{
"name": "hello-ts",
"license": "NOLICENSE",
"devDependencies": {
"typescript": "^5.0.4"
},
"scripts": {
"dev": "tsc --watch --preserveWatchOutput"
}
}
{
"compilerOptions": {
"outDir": "dist", // where to put the TS files
"target": "es2016" // which level of JS support to target
},
"include": ["src/**/*"], // which files to compile
}
Du ska inte behöva ändra så mycket, just nu kan du ändra detta. Om du vill.
Kan användas när man konverterar JS till TS, men undvikas till slutproduktion
En TS variabel "föds" när den får en type, tills dess är den av typ any
I motsats finns never och unknown (vi kommer till det längre fram i kursen)
const car: {
make: string
model: string
year: number
}
car = { make: 'Volvo', model: 'V70', year: 2011 }
function printCar(car: {
make: string
model: string
year: number
}) {
console.log(`${car.make} ${car.model} (${car.year})`)
}
Jobbigt att skriva varje gång
Med hjälp av Typescript kan vi specifiera hur vi vill att exempelvis ett objekt ska se ut genom att använda oss av type eller interface (vi går in på skillnader senare i kursen)
Man kan specifiera vilka properties som accepteras, ex nummer eller string, etc
En parameter kan vara optional med ? - bra att hantera undefined
type Car = {
make: string
model: string
year: number
color?: string
}
const car = { make: 'Volvo', model: 'V70', year: 2011 }
function printCar(car: Car) {
console.log(`${car.make} ${car.model} (${car.year})`)
}
interface Car {
make: string
model: string
year: number
color?: string
}
const car = { make: 'Volvo', model: 'V70', year: 2011 }
function printCar(car: Car) {
console.log(`${car.make} ${car.model} (${car.year})`)
}
Att typa arrayer kan göras med [] eller Array<typ>. Den senare varianten kallas generics och vi återkommer om det (Reactkursen)
const names: string[] = ["Olle", "Kalle", "Nisse"]
names.push("Harlald")
const fruits: Array<string> = ["apple", "banana", "orange"]
fruits.push("pear")
Specifiera vilka typer en funktion tar in som argument och skickar tillbaka. När inget returneras används void. Returtypen kan utelämnas men visuellt kan det vara tydligare.
function echo(message: string): void {
console.log(message.toUpperCase());
}
function echo(message: string): string {
return `The message is ${message}`;
}
Klassisk setteori: OR eller AND. Antingen en frukt eller något surt.
Union types kan beskrivas i Typescript med | (pipe-operator). den associerade typen kan vara av en eller flera andra typer.
function flipCoin(): "heads" | "tails" {
if (Math.random() > 0.5) return "heads"
return "tails"
}
const outcome = flipCoin()
// Funktionen tar inte antingen en sträng ELLER ett nummer
function displayMessage(message: string | number): void {
if (typeof message === "string") {
console.log(`Message: ${message}`);
} else {
console.log(`Message as a number: ${message}`);
}
}
displayMessage("Hello, TypeScript!");
displayMessage(133);
# PRESENTING CODE
Klassisk setteori: OR eller AND
Intersection types kan beskrivas i Typescript med & (ampersand-operator)
En type som kombinerar en eller flera typer
// Definerar en User type
type User = {
id: number;
username: string;
};
// Definierar en Role type
type Role = {
role: string;
permissions: string[];
};
// Skapar en typ som kombinerar både User och Role (intersection)
type UserProfile = User & Role;
// Skapar en användarprofil objekt av type UserProfile
const userProfile: UserProfile = {
id: 1,
username: "john doe",
role: "admin",
permissions: ["read", "write", "delete"],
};
// Få tag i properties av objektet userProfile
console.log(`User ID: ${userProfile.id}`);
console.log(`Username: ${userProfile.username}`);
console.log(`Role: ${userProfile.role}`);
console.log(`Permissions: ${userProfile.permissions.join(", ")}`);
type Shape = Shape2D & Shape3D;
let shape: Shape= {
shape: 'Square',
color: 'Red',
noEdges: 4,
volume: 0
};