🎁 Meld je nu aan en krijg maximaal 30 minuten gratis online AI-gebruik. Geen creditcard nodig.

TypeScript-interviewvragen en antwoorden (2026): Types, Generics en Narrowing

October 9, 2026
20 TypeScript-interviewvragen met antwoorden, getest in strict mode: type vs interface, any vs unknown, unions, generics, utility types en structurele typing.
TypeScript-interviewvragen en antwoorden (2026): Types, Generics en Narrowing
typescript interview vragen
typescript interview
type vs interface
any vs unknown typescript
typescript generics interview

TypeScript-interviews testen of je het typesysteem begrijpt, verder dan de syntax. Hieronder staan 20 vragen met antwoorden, van de basis tot de vragen die mensen die TypeScript gebruiken scheiden van mensen die weten waarom het werkt. De code is vóór publicatie gecompileerd met de TypeScript-compiler in strict mode, en de aangehaalde foutmeldingen zijn de echte.

Basis

1. Wat voegt TypeScript toe aan JavaScript?

Een statisch typesysteem dat tijdens het compileren wordt gecontroleerd en daarna wordt gewist. De output is gewoon JavaScript, dus types hebben geen runtime-kosten en geen runtime-aanwezigheid. Dat laatste punt is belangrijk: je kunt een type niet tijdens runtime controleren met typeof, tenzij je die controle zelf schrijft.

2. Wat is het verschil tussen type en interface?

Beide beschrijven de vorm van objecten en zijn vaak uitwisselbaar. De praktische verschillen:

interfacetype
Declaratie-samenvoegingJa, twee declaraties worden samengevoegdNee, een dubbele naam is een fout
Unions en primitievenKan ze niet uitdrukkenKan ze uitdrukken, zoals een union van number en string
UitbreidenextendsIntersectie met &
Mapped en conditional typesNeeJa

Als je twee keer interface A declareert, worden de velden samengevoegd. Als je twee keer type B declareert, krijg je error TS2300: Duplicate identifier 'B'. Een veelgebruikte vuistregel: gebruik interface voor openbare objectvormen die anderen mogen uitbreiden, en type voor al het overige.

3. Wat is het verschil tussen any, unknown en never?

  • any zet de controle uit. Alles mag, en fouten blijven verborgen.
  • unknown is de veilige versie. Je kunt er alles aan toewijzen, maar je moet het narrowen voordat je het gebruikt. x.toFixed() aanroepen op een unknown mislukt met error TS18046: 'x' is of type 'unknown'.
  • never is het type van waarden die niet kunnen bestaan, zoals een functie die altijd throwt. Het is handig voor exhaustieve controles.

Geef de voorkeur aan unknown boven any voor waarden waarvan je het type niet beheert, zoals geparseerde JSON.

4. Wat doet strict mode?

Het zet een groep controles aan, waarvan de belangrijkste strictNullChecks (zodat null en undefined aparte types zijn) en noImplicitAny. Daarmee geeft het gebruik van een optionele waarde zonder controle error TS18048: 'x' is possibly 'undefined'. Nieuwe projecten zouden moeten beginnen met strict aan.

5. Wat is het verschil tussen readonly en const?

const voorkomt dat een variabele opnieuw wordt toegewezen. readonly voorkomt dat een eigenschap wordt toegewezen. Schrijven naar een readonly-eigenschap geeft error TS2540: Cannot assign to 'n' because it is a read-only property. Geen van beide maakt het onderliggende object diepgaand immutable.

Types in de praktijk

6. Wat zijn union types en hoe narrow je ze?

Een union betekent "een van deze types". Narrowen gebruikt controles die de compiler begrijpt:

type Id = number | string;
function describe(id: Id): string {
  if (typeof id === "string") return id.toUpperCase();
  return id.toFixed(1);
}

Binnen de if is id een string. Daarna weet de compiler dat het een number is. Andere narrowing-hulpmiddelen zijn instanceof, de in-operator, gelijkheidscontroles en custom type guards.

7. Wat is een discriminated union?

Een union waarbij elk lid een gedeeld literal-veld heeft, de discriminant, dat ze van elkaar onderscheidt:

type Shape =
  | { kind: "circle"; r: number }
  | { kind: "sq"; s: number };

function assertNever(x: never): never {
  throw new Error("unexpected " + x);
}

function area(s: Shape): number {
  switch (s.kind) {
    case "circle": return Math.PI * s.r ** 2;
    case "sq": return s.s ** 2;
    default: return assertNever(s);
  }
}

Als je later een nieuwe vorm toevoegt en een case vergeet, compileert de default-tak niet meer, omdat s dan geen never meer is. Dat is een exhaustieve controle.

8. Wat zijn generics, en waarom zou je ze gebruiken?

Ze laten een functie of type over veel types werken terwijl de relatie ertussen behouden blijft:

function first<T>(xs: T[]): T | undefined { return xs[0]; }
function pick<T, K extends keyof T>(o: T, k: K): T[K] { return o[k]; }

first([1, 2]) geeft number | undefined terug, niet any. pick(user, "name") geeft het type van name terug. De constraint extends keyof T voorkomt dat je een sleutel doorgeeft die niet bestaat.

9. Wat zijn de gangbare utility types?

UtilityWat het doet
Partial<T>Maakt elke eigenschap optioneel
Required<T>Maakt elke eigenschap verplicht
Readonly<T>Maakt elke eigenschap readonly
Pick<T, K>Behoudt alleen de opgegeven sleutels
Omit<T, K>Verwijdert de opgegeven sleutels
Record<K, V>Een objecttype met sleutels K en waarden V
ReturnType<F>Het retourtype van een functietype

10. Wat zijn mapped types?

Ze bouwen een nieuw type door over de sleutels van een ander type te itereren. Partial zelf is geschreven als { [K in keyof T]?: T[K] }. Als je dat weet, laat je zien dat je utility types begrijpt in plaats van ze uit je hoofd te leren.

11. Wat is as const?

Het vertelt de compiler om het nauwste type af te leiden en alles als readonly te markeren. const arr = [1, 2, 3] as const heeft het type readonly [1, 2, 3], en arr.push(4) mislukt met error TS2339: Property 'push' does not exist on type 'readonly [1, 2, 3]'. Het is handig voor lijsten met toegestane waarden en voor configuratie-objecten.

12. Wat is een type assertion, en wanneer is die gevaarlijk?

value as Type vertelt de compiler je te vertrouwen. Het voert tijdens runtime geen controle uit. Als je het mis hebt, komt de fout later naar boven als een crash. Geef de voorkeur aan narrowen met een controle, of een type guard-functie, boven asserten.

Taalgedrag

13. Wat is het verschil tussen null en undefined?

undefined betekent dat er nooit een waarde is toegekend, en null betekent dat er bewust "geen waarde" is ingesteld. Met strictNullChecks zijn het aparte types. Gebruik optional chaining (a?.b) en nullish coalescing (a ?? b) om ze af te handelen. Anders dan bij || valt ?? alleen terug op null en undefined, dus 0 en de lege string blijven behouden.

14. Wat is de non-null assertion !?

value! vertelt de compiler dat een waarde niet null of undefined is. Net als as wordt dit niet gecontroleerd. Het is prima op een paar plekken waar je het beter weet dan de compiler, maar een runtime-check is meestal veiliger.

15. Wat doet keyof, en wat is typeof in een typepositie?

keyof T levert de union van de eigenschapsnamen van T op. In een typepositie neemt typeof x het type van een waarde over, wat voorkomt dat je het herhaalt. Samen geeft keyof typeof obj de keys van een object dat je als waarde hebt gedefinieerd.

16. Hoe verhouden enums zich tot union types?

Enums maken een runtime-object en waarden aan. Een union van string-literals, zoals "idle" | "loading", wordt tijdens compilatie weggehaald en vereist geen extra code. Veel teams geven de voorkeur aan string-literal unions vanwege de eenvoud en gebruiken enums wanneer ze het runtime-object nodig hebben.

Tooling en echte projecten

17. Wat doet tsconfig.json, en welke opties zijn belangrijk?

Het vertelt de compiler welke bestanden moeten worden meegenomen en hoe ze moeten worden gecontroleerd. Opties waar interviewers naar vragen: strict, target (de JavaScript-versie die wordt uitgevoerd), module en moduleResolution, noEmit (alleen controleren, wat gebruikelijk is wanneer een andere tool de build doet), esModuleInterop en skipLibCheck.

18. Hoe typeer je iets dat van buitenaf komt, zoals een API-response?

Types verdwijnen tijdens runtime, dus de compiler kan niet verifiëren wat het netwerk teruggeeft. Behandel de data als unknown en valideer deze vervolgens met een schema-bibliotheek of een handgeschreven type guard voordat je het gebruikt. Een type beweren op geparseerde JSON verbergt bugs.

19. Hoe migreer je een JavaScript-project naar TypeScript?

Doe het geleidelijk. Voeg een tsconfig.json toe met allowJs, hernoem bestanden één voor één, schakel na verloop van tijd strengere opties in en voeg eerst types toe op de grenzen, zoals API-clients en gedeelde utilities. Vermijd een big-bang-rewrite.

20. Wat is structural typing?

TypeScript vergelijkt types op basis van vorm, niet op basis van naam. Als een object de velden heeft die een type vereist, wordt het geaccepteerd, zelfs als het nooit als dat type is gedeclareerd. Het verschilt van talen die nominal typing gebruiken, waar de gedeclareerde naam ertoe doet.

Hoe je je voorbereidt

  1. Open een playground of een klein project in strict mode en probeer elk voorbeeld hierboven, inclusief de voorbeelden die juist moeten falen.
  2. Wees klaar om een generieke functie en een discriminated union uit je hoofd te schrijven.
  3. Weet waarom je unknown boven any zou kiezen.
  4. Bereid één verhaal voor over het typen van iets lastigs in een echt project.

Voor gerelateerde oefening kun je onze gidsen bekijken over Node.js interviewvragen, Angular interviewvragen en Python interviewvragen.

Oefen hardop en in je eigen woorden. Een transcript achteraf laat zien waar je afdwaalde of het punt miste. Volg de regels van de werkgever over AI-tools in elk live interview of assessment.

Oefen je antwoorden met YesToTheOffer

Oefen hardop, krijg antwoorden op basis van je eigen cv en bekijk achteraf je transcript. 30 gratis minuten, geen abonnement.

iOS & Android — Binnenkort
Bekijk prijzen