Direct naar de hoofdinhoud
Module 2 · Les 1 van 23/14 in de cursus~12 min
Modulelessen (1/2)

Type aliassen versus interfaces

In TypeScript kunnen we de structuur van complexe objecten op twee manieren definiëren: door Interfaces (interface) of Type Aliassen (type) te gebruiken. Beide dienen om de ‘vorm’ van een object of datastructuur te beschrijven, maar ze hebben een paar fundamentele verschillen.


Interfaces (interface)

Een interface definieert een contract voor de structuur van een object. Het is de standaardtool om objectvormen en publieke API’s op een uitbreidbare manier te beschrijven.

TS
interface Book {
  title: string;
  pages: number;
  author?: string; // Optional property (can be omitted)
}

const myBook: Book = {
  title: 'The Lord of the Rings',
  pages: 1200,
};

Het vraagteken (?) markeert een eigenschap als optioneel. Het object myBook is geldig, zelfs als de eigenschap author wordt weggelaten.


Type aliassen (type)

Met een typealias kunt u een nieuwe naam koppelen aan elk bestaand type, inclusief primitieve typen, unies, tupels of volledige objectstructuren.

TS
type Point = {
  x: number;
  y: number;
};

const coordinates: Point = { x: 10, y: 20 };

Belangrijkste verschillen: samenvoegen van uitbreidingen en aangiften

Hoewel interface en type uitwisselbaar zijn voor de meeste gewone gebruikssituaties, vertonen ze twee cruciale verschillen:

1. Uitbreidbaarheid (overerving)

Interfaces worden uitgebreid met het trefwoord extends:

TS
interface User {
  username: string;
}

interface Admin extends User {
  privileges: string[];
}

Type-aliassen kunnen niet worden uitgebreid met extends, maar ze kunnen wel worden gecombineerd met de operator intersection (&):

TS
type User = {
  username: string;
};

type Admin = User & {
  privileges: string[];
};

2. Samenvoeging van aangiften

Meerdere interfaces met dezelfde naam in hetzelfde bereik worden automatisch samengevoegd door de compiler:

TS
interface User {
  name: string;
}
interface User {
  email: string;
}
// Now User has both 'name' and 'email'!

Dit gedrag wordt niet ondersteund door type-aliassen: het tweemaal declareren van dezelfde type zal een compileerfout veroorzaken.


Probeer het zelf

Oefening 1: Gebruikersinterface

Oefening#ts.m2.l1.e1
Pogingen: 0Laden…

Definieer een interface met de naam Gebruiker die een gebruikersobject beschrijft. De interface moet het volgende bevatten: id als nummer, gebruikersnaam als string en e-mailadres als optionele string.

Editor laden…
Toon hint

Gebruik de syntaxis email?: string om deze als optioneel te markeren.

Oplossing beschikbaar na 3 pogingen

Oefening 2: Point2D-typealias

Oefening#ts.m2.l1.e2
Pogingen: 0Laden…

Maak een typealias met de naam Point2D die een tweedimensionaal punt vertegenwoordigt met de coördinaten x en y (beide getallen).

Editor laden…
Toon hint

Gebruik het syntaxistype Point2D = { x: getal; y: nummer; };

Oplossing beschikbaar na 3 pogingen

Oefening 3: Interfaces uitbreiden

Oefening#ts.m2.l1.e3
Pogingen: 0Laden…

Definieer een interface genaamd Product met id (nummer) en prijs (nummer). Definieer vervolgens een interface met de naam DiscountedProduct die Product uitbreidt en een optionele eigenschap toevoegt met de naam discountCode (string).

Editor laden…
Toon hint

Gebruik extends Product om de velden over te nemen en discountCode?: string toe te voegen.

Oplossing beschikbaar na 3 pogingen

Oefening 4: Serverconfiguratie

Oefening#ts.m2.l1.e4
Pogingen: 0Laden…

Definieer een typealias met de naam ServerConfig die een configuratieobject voor een server vertegenwoordigt. Het moet het volgende bevatten: host (tekenreeks), poort (nummer) en useHttps als optioneel booleaans veld.

Editor laden…
Toon hint

Gebruik het syntaxistype ServerConfig = { host: string; poort: nummer; gebruikHttps?: boolean; }.

Oplossing beschikbaar na 3 pogingen