# Les 4: TypeScript Fundamentals (Deel 1) ## Lesdetails | Onderdeel | Details | |-----------|---------| | **Lessenreeks** | Les 4 van 18 | | **Onderwerp** | TypeScript Fundamentals | | **Curriculumdeel** | Deel 2: Technical Foundations (Les 4-9) | | **Datum** | - | | **Duur totaal** | 3 uur (180 minuten) | | **Spreektijd** | ~55 minuten | | **Hands-on** | ~75 minuten | | **Pauze** | 15 minuten | | **Niveau** | Beginner/Intermediate | | **Docent** | - | --- ## Leerdoelen Na deze les kan de student: 1. **Uitleggen** waarom TypeScript waardevol is voor developers en hoe het zich verhoudt tot JavaScript 2. **Gebruiken** van basic types: string, number, boolean, arrays en tuples 3. **Begrijpen** hoe type inference werkt en wanneer TypeScript types automatisch detecteert 4. **Schrijven** van interfaces en type aliases voor complexe objecten 5. **Toepassen** van union types en literal types in praktische situaties 6. **Implementeren** van optional properties en functies met type safety 7. **Lezen** en **oplossen** van TypeScript errors met behulp van Cursor 8. **Onderscheiden** tussen interface en type alias en weten wanneer welke te gebruiken --- ## Lesverloop ### Blok 1: Welkom & Terugblik (10 min | 09:00-09:10) **Doel:** Studenten welkom heten, context schetsen, en vorige les evalueren **Activiteiten:** - Welkomslide tonen - Korte vraag over huiswerk Les 3: "Wie heeft de Cursor-vraagstukken afgerond? Wat was lastig?" - Feedback op Les 3 geven (tips voor beter gebruik van Cursor) - **Overgangsmoment:** "Vandaag leren we de taal die Cursor schrijft – TypeScript. Dit is wat je nodig hebt om echt met Cursor, React en Next.js te werken." **Spreektijd:** ~5 min | **Presentatie:** ~5 min **Slides/Materiaal:** - Titelbanner Les 4 - Screenshot vorige les (Cursor in actie) --- ### Blok 2: Waarom TypeScript? (15 min | 09:10-09:25) **Doel:** Motivatie en context voor TypeScript **Theoretisch onderdeel (~10 min):** 1. **Het probleem met JavaScript:** - Runtime errors: bugs die pas in productie ontdekt worden - Voorbeeld: `const user = { name: "Jan" }; console.log(user.emai);` (typo, geen fout!) - Geen type safety: functies accepteren willekeurig wat 2. **De oplossing: TypeScript:** - Compile-time type checking (errors voorkomen *voor* je code draait) - Betere autocomplete in IDE / Cursor - Self-documenting code - Beter voor AI (Cursor snapt je code beter) 3. **TypeScript in het ecosysteem:** - Next.js: standaard TypeScript setup - React: de industry standard (95% professionele projecten) - Cursor: geschreven voor TypeScript developers **Live demo (~5 min):** - Open Cursor - Toon JavaScript-voorbeeld met bug - Converteer naar TypeScript - Toon hoe TypeScript de fout aangeeft *voordat* je het draait **Spreektijd:** ~12 min | **Live coding:** ~3 min **Slides/Materiaal:** - "JavaScript vs TypeScript" vergelijking - Live demo Cursor (voorbereid) - Code snippets JavaScript/TypeScript --- ### Blok 3: Basic Types & Type Inference (15 min | 09:25-09:40) **Doel:** Fundamentele types begrijpen **Theoretisch onderdeel (~10 min):** 1. **Primitieve types:** ```typescript // Expliciet typen const name: string = "Alice"; const age: number = 25; const isActive: boolean = true; // Type inference (TypeScript raadt het zelf) const city = "Amsterdam"; // TypeScript weet: dit is string ``` 2. **Arrays:** ```typescript const numbers: number[] = [1, 2, 3]; const names: string[] = ["Alice", "Bob"]; const mixed: (string | number)[] = ["Alice", 25]; // Union type // Generische notatie const items: Array = [1, 2, 3]; ``` 3. **Type inference:** - TypeScript detecteert types uit context - Tip: niet overal types schrijven (onnodig verbose) - Best practice: inference gebruiken waar duidelijk, types schrijven waar complex 4. **Speciale types:** - `any`: "ik weet niet wat dit is" (vermijden!) - `unknown`: "veilige `any`" - `null` en `undefined` (zelfstandige types in strikt mode) **Live coding (~5 min):** - Toon type inference in Cursor (hover over variabelen) - Toon fout: `const x: number = "hello";` - Toon hoe Cursor autocomplete helpt **Spreektijd:** ~11 min | **Live coding:** ~4 min **Slides/Materiaal:** - Type-overzicht tabel - Voorbeeldcode (met hover-screenshots) - Common mistakes --- ### Blok 4: Interfaces & Type Aliases (15 min | 09:40-09:55) **Doel:** Complexe structuren typen **Theoretisch onderdeel (~10 min):** 1. **Interfaces voor objecten:** ```typescript interface User { id: number; name: string; email: string; age?: number; // Optional } const user: User = { id: 1, name: "Alice", email: "alice@example.com" // age is optional }; ``` 2. **Type aliases:** ```typescript type Status = "pending" | "approved" | "rejected"; // Union type type ID = number | string; interface Request { id: ID; status: Status; } ``` 3. **Union types & literal types:** ```typescript type ResponseType = "success" | "error" | "pending"; const response: ResponseType = "success"; // OK // const invalid = "warning"; // Error! ``` 4. **Interface vs Type:** - Interface: voor objecten, kan extended worden, duidelijk intent - Type: meer flexibel, ook voor primitives, union types - In praktijk: **gebruik interface voor objecten, type voor unions** **Live coding (~5 min):** - Definieer een User interface in Cursor - Toon error bij foute property - Toon autocomplete voor interface-properties - Refactor naar type alias **Spreektijd:** ~11 min | **Live coding:** ~4 min **Slides/Materiaal:** - Interface voorbeeld - Type alias voorbeeld - Venn diagram: interface vs type - Best practices tabel --- ### Blok 5: Functies & Errors (10 min | 09:55-10:05) **Doel:** Functies typen en errors lezen **Theoretisch onderdeel (~7 min):** 1. **Function signatures:** ```typescript // Parameters typen function greet(name: string): string { return `Hello, ${name}`; } // Arrow function const add = (a: number, b: number): number => a + b; // Optional parameter function sayHi(name?: string): void { console.log(`Hi ${name || "stranger"}`); } // Return type inference const multiply = (x: number, y: number) => x * y; // automatisch number ``` 2. **Veelvoorkomende TypeScript errors:** - `Type 'string' is not assignable to type 'number'` - `Property 'xxx' does not exist on type 'yyy'` - `Argument of type 'string' is not assignable to parameter of type 'number'` - Hoe te lezen: "TypeScript zegt dat X niet past in Y" 3. **Cursor helpt:** - Error messages klikken = instant fix suggestion - Hover = type info - Autocomplete voorkomt errors **Live coding (~3 min):** - Definieer functie met foute parameter-types - Toon error - Fix met Cursor quick fix **Spreektijd:** ~8 min | **Live coding:** ~2 min **Slides/Materiaal:** - Function type syntax cheatsheet - Error message breakdown poster - Quick fix voorbeelden --- ### Blok 6: Hands-On Intro (5 min | 10:05-10:10) **Doel:** Studenten klaar zetten voor praktijk **Activiteiten:** 1. **TypeScript Escaperoom uitleggen:** - Structuur: 5 kamers, elke kamer is een TypeScript-puzzel - Doel: code correct typen en bugs fixen - Hint: de "escape code" is een reeks getallen (niet het doel, maar de bewijsvoering) 2. **Project setup:** - Git repo klonen / files openen in Cursor - `npm install` en `npm run build` uitvoeren - Cursor diagnostics controleren (errors zichtbaar?) 3. **Eerste stappen:** - Open kamer 1 (index.ts) - Volg de comments (wat moet je typen?) - Cursor helpt met autocomplete **Spreektijd:** ~5 min **Materiaal:** - Project folder download link - Setup instructies (uitgeprint of digitaal) - Slack/Discord voor vragen --- ### ☕ PAUZE (10:10-10:25) | 15 minuten **Docent checkt ondertussen:** - Alle studenten zijn aan het programmeren - Geen blokkades (technisch of conceptueel) - Voorbereidingen voor vervolg --- ### Blok 7: Hands-On Deel 2 (75 min | 10:25-11:45) **Doel:** Studenten zelfstandig laten programmeren met begeleiding **Structuur:** | Tijd | Checkpoint | Actie | |------|-----------|-------| | 10:25-10:45 | Start | Studenten werken, docent loopt rond | | 10:45 | Check 1 | "Wie zit al bij kamer 3?" – groepsconversatie | | 11:00 | Check 2 | "Wie heeft de helft?" – snelle feedback | | 11:30 | Check 3 | "Wie heeft de escape code?" – bijna klaar | | 11:45 | Einde | Wrap-up + vooruitkijken | **Docent-taken:** - Ronde maken: vragen beantwoorden, hints geven - **Niet zeggen:** "Je doet het verkeerd" - **Wel zeggen:** "Wat zegt TypeScript? Laat die error eens zien." - Snelle studenten: bonus challenges geven (zie "Bonus uitdagingen") - Langzame studenten: stapje terug, vereenvoudigen, samen debuggen **Student-taken:** - Volg de comments in code - Maak één kamer tegelijk af - Gebruik Cursor: hover, autocomplete, quick fixes - Vraag docent of klasgenoten als je vast zit (niet opgeven!) **Mogelijke blokkades & oplossingen:** | Probleem | Oorzaak | Oplossing | |----------|---------|-----------| | "Cursor geeft geen errors" | TypeScript niet correct geïnstalleerd | `npm install -D typescript` opnieuw | | "Ik snap de hints niet" | Comment is te cryptisch | Docent vertaalt de hint in eigen woorden | | "Ik kom niet verder" | Conceptueel niet begrepen | Teruggaan naar een eerder concept (Blok 3/4) | | "Ik ben klaar" | Student is snel | Bonus challenges geven (zie onder) | **Bonus uitdagingen** (voor snelle studenten): 1. **Generics:** - Schrijf een `Container` interface - Gebruik het met verschillende types 2. **Advanced unions:** - Maak een discriminated union: `type Result = { status: "success", data: string } | { status: "error", message: string }` - Schrijf een functie die dit handlert 3. **Recursive types:** - Definieer een boomstructuur type - Maak een (eenvoudige) boomconstructor 4. **Type narrowing:** - Schrijf functie die `string | number` handlert - Gebruik `typeof` checks **Spreektijd:** Afhankelijk van vragen (~20 min rond voor hulp) | **Student work:** ~55 min **Materiaal:** - TypeScript Escaperoom project (voorbereid) - Hint card voor docent - Bonus challenges (optioneel handout) --- ### Blok 8: Afsluiting (15 min | 11:45-12:00) **Doel:** Reflectie, evaluatie, voorbereiding volgende les **Activiteiten:** 1. **Escape codes vergelijken (~3 min):** - Wie heeft de code afgerond? Welk nummer? - Toon 2-3 juiste oplossingen op het scherm - Complimenteer creativiteit / alternatieve approaches 2. **Samenvatting lesinhoud (~5 min):** - Recap: "Wat hebben we vandaag geleerd?" - Studenten noemen 3 dingen (whiteboard of verbal) - Benadrukt: TypeScript = Cursors taal, nodig voor React/Next.js 3. **Huiswerk uitleggen (~4 min):** - **Huiswerk Les 4:** - Afmaken TypeScript Escaperoom (kamer 5 als niet afgerond) - Lezen: [TypeScript Handbook] Sectie "Everyday Types" + "Narrowing" - Voorbereidingsvraag: "Hoe zou je een type schrijven voor een functie die ALLES als input kan nemen?" - Inleveren: screenshot escape code + reflectie (100 woorden): "Wat vond je van TypeScript? Welk concept was moeilijk?" 4. **Preview Les 5 (~3 min):** - "Volgende les: TypeScript in React" - Teasers: "Props typen", "State management", "Custom hooks" - "Alles wat je vandaag hebt geleerd, gebruiken we volgende week in echte React-componenten" **Spreektijd:** ~15 min | **Presentatie:** ~12 min **Slides/Materiaal:** - Samenvatting slide - Huiswerk slide (duidelijk, ook digitaal beschikbaar) - Les 5 teasers --- ## Materialen & Resources ### Bestanden in `/Les04-TypeScript-Fundamentals/` ``` Les04-TypeScript-Fundamentals/ ├── Les04-Lesplan.md (dit bestand) ├── Les04-Slides.pptx │ ├── Titelbanner │ ├── JavaScript vs TypeScript │ ├── Type overzicht │ ├── Interface voorbeelden │ ├── Function signatures │ └── Samenvatting ├── Les04-Handout.pdf │ ├── Type cheatsheet │ ├── Common errors │ └── Quick reference ├── Escaperoom-Project/ │ ├── README.md (setup instructies) │ ├── package.json │ ├── tsconfig.json │ ├── src/ │ │ ├── kamer-1.ts (string, number, boolean) │ │ ├── kamer-2.ts (arrays) │ │ ├── kamer-3.ts (interfaces) │ │ ├── kamer-4.ts (union types) │ │ └── kamer-5.ts (functions) │ ├── solutions/ │ │ ├── kamer-1.solution.ts │ │ ├── kamer-2.solution.ts │ │ ├── kamer-3.solution.ts │ │ ├── kamer-4.solution.ts │ │ └── kamer-5.solution.ts │ └── escape-codes.txt ├── Les04-QuickStart.md (koppelingen naar externe resources) ├── Les04-References.md │ ├── TypeScript Handbook links │ ├── Video tutorials │ └── Community resources └── Les04-Homework.md ├── Leeswerk ├── Codingtaken └── Reflectievragen ``` ### Externe Resources **Officieel:** - [TypeScript Handbook - Everyday Types](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html) - [TypeScript Handbook - Type Narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html) **Interactief:** - TypeScript Playground: https://www.typescriptlang.org/play - Oefeningen: https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html **Community:** - Stack Overflow tag `typescript` - Reddit: r/typescript - Discord TypeScript community --- ## Voorbereiding Docent ### Checklist (1 week voor les) - [ ] **Inhoud:** Alle slides af? Voorbeelden getest? - [ ] **Demo:** Live coding-voorbeelden runnen in Cursor - [ ] **Project:** Escaperoom project klaar? Alle kamers werkend? - [ ] **Solutions:** Solutions files af (voor docent-reference) - [ ] **Handout:** PDF klaar en gedownload op alle student-devices - [ ] **Technisch:** - [ ] TypeScript geïnstalleerd op eigen machine - [ ] Cursor up-to-date - [ ] Node.js versie recente (14+) - [ ] **Communicatie:** Huiswerk vorige week teruggebeven? ### Checklist (1 dag voor les) - [ ] **Slides:** Compleet doorgelopen, timing gecheck - [ ] **Demo's:** Alle live coding-scripts getest - [ ] **Project:** - [ ] Project kloned/gedownload op eigen machine - [ ] `npm install` succesvol - [ ] Alle kamers kunnen draaien - [ ] Escape codes gecontroleerd - [ ] **Ruimte:** - [ ] Projector werkt - [ ] Netwerk stabiel - [ ] Studentenlaptops hebben Cursor/IDE - [ ] **Bonus:** Bonus challenges voorbereid (notities docent) ### Checklist (5 min voor les) - [ ] Slides geopend - [ ] Cursor open met voorbeeld-project - [ ] Chat/Discord open (voor vragen) - [ ] Timer gereed voor Blok 7 checkpoints - [ ] Koffie klaar 😊 ### Docent-notes & Timing | Blok | Timing | Spreektijd | Notes | |------|--------|-----------|-------| | 1 | 10 min | 5 min | Energizer! Studenten voelen zich verwelkomd | | 2 | 15 min | 12 min | **Live demo is cruciaal** – studenten moeten begrijpen WAAROM | | 3 | 15 min | 11 min | Type inference is abstract – veel voorbeelden! | | 4 | 15 min | 11 min | Interfaces/types zijn powerful – dit is A-ha moment | | 5 | 10 min | 8 min | Errors lezen is vaardigheid – docent modeleert dit | | 6 | 5 min | 5 min | Korte instructies, snel starten | | **Pauze** | **15 min** | — | **Docent checkt techniek** | | 7 | 75 min | 20 min | **Geduld!** Niet alle studenten gaan gelijkelijk | | 8 | 15 min | 15 min | Celebrate wins! Huiswerk duidelijk maken | **Timing-tips:** - Blok 2 loopt soms uit → voorkomen met gerepeteerde demo - Blok 3-4 zijn dicht → kunnen samengetrokken naar 25 min als nodig - Blok 7 is flexibel → als studenten sneller gaan, langer doorgaan - Blok 8 altijd uitvoeren (motivatie!) --- ## Veelvoorkomende Problemen & Oplossingen | Probleem | Oorzaak | Symptoom | Oplossing | |----------|---------|----------|-----------| | **TypeScript errors zichtbaar** | Configuratie fout | Cursor toont geen rode underlines | `npm install -D typescript` + Cursor reload | | **"Type 'any' is not assignable"** | Student begrijpt union types niet | Code werkt niet | Terug naar Blok 4, voorbeeld doen | | **Interface vs Type verwarring** | Conceptueel niet verschil begrepen | Student wil type gebruiken voor objects | Venn diagram tonen, herhaald zeggen: "Interface = objects, Type = unions" | | **"Ik snap type inference niet"** | Abstract concept | Student schrijft overal types | Laten zien dat Cursor het weet (hover) – types zijn optioneel | | **Functions niet getyped** | Syntax vergeten | Parameters hebben geen types | Toon `: type` syntax, laat repeteren | | **Escaperoom kamer 3 (interfaces)** | Huiswerk niet gedaan | Student weet niet hoe interfaces werken | Docent doet voorbeeld samen, step-by-step | | **Escaperoom kamer 5 (functions)** | Callback functions verwarrend | Student weet niet hoe functies als type te schrijven | Toon `(arg: Type) => ReturnType` syntax, veel oefenen | | **Student verder willen** | Te makkelijk | Verliest interesse | Bonus challenges geven (zie Blok 7) | | **Student achterblijven** | Te moeilijk | Frustratie, geeft op | Pair programming: docent/klasgenoot helpt | | **Netwerk/technisch probleem** | WiFi down, npm install hangt | Nothing works | Fallback: offline Cursor examples, of pair programming | --- ## Leerresultaten & Evaluatie ### Hoe weet je dat studenten het snappen? **Groen (begrepen):** - ✅ Kan interface schrijven met optionele properties - ✅ Ziet TypeScript error en weet wat het betekent - ✅ Kan union type gebruiken in functie parameter - ✅ Snapt verschil tussen type inference en expliciete types **Oranje (deels):** - ⚠️ Interfaces kan, union types nog niet - ⚠️ Begrijpt errors, weet niet hoe op te lossen - ⚠️ Haalt kamer 3-4 niet (maar 1-2 wel) **Rood (niet begrepen):** - ❌ Alles voelt "magie", begrijpt voordeel TS niet - ❌ Hangt vast bij eerste kamers - ❌ Huiswerk Les 3 niet gedaan (prerequisite gemist) ### Huiswerk Evaluatie **Inleveringseisen:** 1. Screenshot van escape code (bewijs afronding) 2. Reflectie (100 woorden): "Wat vond je van TypeScript? Welk concept was moeilijk?" **Rubric:** - 5: Alle kamers af + thoughtful reflectie - 4: Kamers 1-4 af + redelijke reflectie - 3: Kamers 1-3 af of onvolledig werk - 2: Kamers 1-2 af, reflectie te kort - 1: Niet ingeleverd of onvoldoende --- ## Volgende Stap: Les 5 Preview **Les 5: TypeScript for React/Next.js** In Les 5 gebruiken studenten TypeScript in echte React-componenten: - Props typen met interfaces - State types - Event handlers typen - Custom hooks typen - Nextjs pagina's en API routes **Huiswerk Les 4 voorbereidt op Les 5:** - Kunnen lezen wat types betekenen → begrijpen React props - Union types kennen → discriminated unions in Redux/Zustand - Optional properties kennen → optional React props **Advies docent:** - Veel les 5 oefenen met props-typen (meest praktisch) - React errors (TypeScript gerelateerd) is groot probleem - Early preparation (zeker van React basis vooraf) --- ## Notities Docent (vrijruimte) ``` Notities voor eigen voorbereiding: - Welke voorbeelden zelf toevoegen? - Welke students extra aandacht nodig? - Timing aanpassingen van vorig jaar? - Lokale resources (Slack, Discord)? - Volgende keer: ... [Ruimte voor docent-notities] ``` --- ## Bijlage: Keyboard Shortcuts & Tools ### Cursor Shortcuts (essentieel) | Actie | Shortcut | |-------|----------| | Command Palette | `Ctrl+Shift+P` (Win/Linux) / `Cmd+Shift+P` (Mac) | | Go to Definition | `F12` of `Ctrl+Click` | | Rename Symbol | `F2` | | Quick Fix | `Ctrl+.` | | Format Document | `Shift+Alt+F` | | Terminal | `Ctrl+`` | ### TypeScript Commands ```bash # Project setup npm init -y npm install -D typescript # TypeScript compiler npx tsc --version npx tsc --init # tsconfig.json genereren npx tsc # compileren npx tsc --watch # auto-compileren ``` ### Handige Extensions (voor Cursor) - TypeScript Vue Plugin - Error Lens (errors inline tonen) - Peacock (editor herkennen per workspace) --- ## Reflectie & Verbeteringen ### Van vorig jaar (indien van toepassing) - [ ] Wat werkte goed? - [ ] Wat moet beter? - [ ] Welke voorbeelden updaten? - [ ] Timing aanpassingen? ### Voor volgende jaar - Meer live debugging van TypeScript errors? - Minder of meer Blok 7 challenges? - Escaperoom moeilijkheidsgraad OK? - Student feedback ingebouwd? --- **Laatst bijgewerkt:** 27 februari 2026 **Versie:** 1.0 **Docent:** — **Cursuscoördinatoren:** — *Veel succes met Les 4! TypeScript is een game-changer voor student-developers. Zorg dat ze voelen dat ze iets magisch leren.* ✨