Aufgabe 03 - TypeScript-Katas
Aufgabe 03 - TypeScript-Katas
Abschnitt betitelt „Aufgabe 03 - TypeScript-Katas“Worum geht es?
Abschnitt betitelt „Worum geht es?“Bevor Asynchronität und Framework dazukommen, muss das Typisieren in die Finger: kurze, unabhängige Übungsstücke (Katas) rund um Funktionen, Interfaces und Union Types (siehe Kapitel JavaScript und TypeScript). Ziel ist Routine: zügig typisieren, Compiler-Meldungen lesen, Fachliches als Typen ausdrücken.
Was Sie dafür brauchen
Abschnitt betitelt „Was Sie dafür brauchen“- Kapitel JavaScript und TypeScript, inklusive des Abschnitts zu
anyundunknown; Ihr Setup aus Aufgabe 01.
Welche Kompetenzen Sie erwerben und zeigen
Abschnitt betitelt „Welche Kompetenzen Sie erwerben und zeigen“- Sie typisieren Funktionen und Datenstrukturen vollständig und zügig.
- Sie übersetzen Compiler-Fehlermeldungen in verständliche Aussagen.
- Sie modellieren Fachbegriffe einer Aufgabenstellung als Typen.
Pädagogische Einordnung
Abschnitt betitelt „Pädagogische Einordnung“- Reproduktion: eingeübte Typmuster auf kleine Aufgaben anwenden (Teil A).
- Reorganisation und Transfer: Fehlermeldungen interpretieren, Fallunterscheidungen aus Typen ableiten (Teile B und C).
- Reflexion, Problemlösung und Urteilsbildung: eine Domäne so modellieren, dass der Compiler fachliche Regeln erzwingt (Teil D).
Arbeitsaufträge
Abschnitt betitelt „Arbeitsaufträge“Die Übung ist auf etwa zwei Stunden ausgelegt. Alle Katas landen in katas.ts mit je zwei Testaufrufen; Teil D ist der Expertenteil.
Teil A - Aufwärmen
Abschnitt betitelt „Teil A - Aufwärmen“median(values: number[]): der Median der Liste (sortierte Kopie, nicht das Original sortieren!).initials(firstName, lastName): aus “Alex Muster” wird “A.M.”.celsiusToFahrenheit(celsius)samt Umkehrfunktion; Rundreise mitconsole.assertprüfen.
Teil B - Interfaces und Optionales
Abschnitt betitelt „Teil B - Interfaces und Optionales“interface Appointment(Titel, Beginn alsDate, Dauer in Minuten, optionaler Raum) undendOf(appointment): liefert den Endzeitpunkt alsDate.describeRoom(appointment): liefert den Raum oder"kein Raum reserviert"; Pflicht:??, keinif.overlaps(a, b): überschneiden sich zwei Termine? Testen Sie bewusst die Grenzfälle (Ende = Beginn).
Teil C - Union Types und der Compiler
Abschnitt betitelt „Teil C - Union Types und der Compiler“describeInput(input: string | number): bei Strings die Länge, bei Zahlen das Vorzeichen. Der Compiler erzwingt die Fallunterscheidung mittypeof; probieren Sie aus, was ohne sie passiert, und notieren Sie die Meldung.type Grade = 1 | 2 | 3 | 4 | 5undisPassing(grade: Grade): Was meldet der Compiler beiisPassing(6)? Original notieren und in eigene Worte übersetzen.parseAppointment(raw: unknown): Appointment | null: Der Wert kommt ausJSON.parseund ist damit von unbekannter Form. Prüfen Sie ihn, bevor Sie ihn verwenden, und liefern Sienull, wenn die Form nicht stimmt. Notieren Sie zusätzlich die Compiler-Meldung, die beim direkten Zugriff aufraw.titleerscheint.- Sie erhalten fünf Codezeilen mit Typfehlern (werden ausgeteilt; darunter Zahl an String-Parameter, Zugriff auf möglicherweise
undefined, falscher Rückgabetyp). Für jede: Meldung im Original, Übersetzung in einen verständlichen Satz, Behebung. Die Übersetzung ist der wichtigste Teil; Compiler-Englisch muss man lesen lernen.
Teil D - Expertenteil: Das Safi-Sortiment im Typsystem
Abschnitt betitelt „Teil D - Expertenteil: Das Safi-Sortiment im Typsystem“Modellieren Sie das Sortiment der Schulkantine “Safi” - Brötchen, Nudeln, Salat, Getränke, Joghurt und dergleichen - so, dass der Compiler die fachlichen Regeln erzwingt:
- Artikel haben Name und Preis; ihre Ernährungsart ist
"vegetarian" | "vegan" | "meat"(etwa Käsebrötchen vegetarisch, Schinkenbrötchen mit Fleisch, Apfelsaft vegan). Manchmal macht Safi einen “Aktionsartikel des Tages” und diese haben dann zusätzlich einen Wochentag ("monday" | ... | "friday"). - Schreiben Sie
vegetarianOnly(items)so, dass der Rückgabetyp Artikel mit Fleisch unmöglich macht. Hinweis: Definieren Sie die Ernährungsart als eigenen Union Type und einen verengten Typ für das Ergebnis; die Schreibweise für eigene Prüffunktionen (item is VegetarianItem) steht im Kapitel im Abschnitt zuanyundunknown. - Beweisen Sie die Erzwingung: Ein Testaufruf, der dem Ergebnis ein Schinkenbrötchen unterschieben will, muss ein Compile-Fehler sein (als Kommentar mit der Meldung dokumentieren).
- Beurteilen Sie in drei Sätzen: Welche fachliche Regel steckt jetzt im Typsystem statt in einer Laufzeitprüfung, und was ist der Gewinn?
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Warum sortiert
medianeine Kopie statt des übergebenen Arrays? - Wie erzwingt
string | numbereine Fallunterscheidung, und womit trifft man sie? - Was ist der Unterschied zwischen
type Grade = 1 | 2 | 3 | 4 | 5undnumbermit Laufzeitprüfung? - Wozu ein optionales Feld (
room?) stattroom: string | null? Nennen Sie einen Unterschied. - Was bedeutet die Rückgabetyp-Schreibweise
item is VegetarianItem? - Warum verlangt ein Wert vom Typ
unknowneine Prüfung, bevor man ein Feld liest?
katas.ts (kompiliert ohne Fehler, alle Testaufrufe korrekt) mit den übersetzten Fehlermeldungen als Kommentar.