Aufgabe 01 - TypeScript-Spickzettel
Lernziele
Abschnitt betitelt „Lernziele“- Du legst ein Node.js-Projekt an, installierst Werkzeuge als
devDependenciesund definierst und startest Skripte in derpackage.json. - Du erklärst die Aufgabe der Sperrdatei, begründest, warum sie ins Repository gehört und
node_modules/nicht, und stellst die Umgebung mitnpm ciwieder her. - Du setzt
const/let, beide Funktionsschreibweisen,map/filter/reduce, Objektliterale, Template-Literale und Module sicher ein. - Du untersuchst, warum eine Kopie mit Spread flach ist und wann
??etwas anderes liefert als||. - Du beschreibst Daten mit
interfaceund erklärst, welche Fehler TypeScript vor dem Programmlauf abfängt.
Ausgangslage
Abschnitt betitelt „Ausgangslage“Jede Profi-Köchin hat ihr eigenes Rezeptbuch mit Notizen am Rand, nicht, weil sie die Rezepte nicht kennt, sondern weil sie beim Kochen nicht suchen will. Genau so ein Nachschlagewerk baust du dir hier für das ganze Jahr.
Du richtest die Werkzeugkette des Jahres ein (Node.js, npm, TypeScript) und erstellst deinen persönlichen Spickzettel der Sprachkonstrukte (siehe Kapitel JavaScript und TypeScript, Einheiten 1.1 bis 1.5, und Kapitel npm: Pakete und Projekte). Der Lerneffekt liegt im Weg dorthin: Jedes Konstrukt wird einmal selbst getippt, ausgeführt und in eigenen Worten beschrieben.
Allgemein
Abschnitt betitelt „Allgemein“Projektordner anlegen siehe https://qiz.at/projektordner
- Lies vorher kurz https://qiz.at/assignmentsabgabe durch.
- Nur vollständige Abgaben (siehe https://qiz.at/rules) können positiv bewertet werden.
- Abgabe- und Testdetails siehe https://qiz.at/assignmentsabgabe
- Die Übung liegt als Unterordner
uebung-01in deinem Jahres-RepositorySJ26_27_4AHITM_SEW_<Benutzername>_exercises(siehe Einheit 1.1 Werkzeuge einrichten, Abschnitt “Wo deine Projekte liegen”). Du arbeitest allein.
Wesentlich_überwiegend
Abschnitt betitelt „Wesentlich_überwiegend“Aufgabe
Abschnitt betitelt „Aufgabe“- Prüfe
node --versionundnpm --version. Leg den Projektordneruebung-01an und führe darinnpm init -yaus. Stell in derpackage.jsonden Eintrag"type"auf"module", dannnpm install --save-dev typescript tsxundnpx tsc --init. - Schreib
hello.tsmit einer Ausgabe über ein Template-Literal. Ergänze unterscriptsdie Einträge"dev": "tsx hello.ts"und"typecheck": "tsc --noEmit"und starte beide mitnpm run devundnpm run typecheck. - Bau absichtlich einen Typfehler in
hello.tsein (etwaconst count: number = "drei";) und führe beide Skripte erneut aus. Notiere in einer Dateianswers.md, welches Skript den Fehler meldet und welches nicht, und lass die Zeile danach als Kommentar stehen. - Leg eine
.gitignoremitnode_modules/an. Beantworte inanswers.mdin je einem Satz: Warum sindtypescriptundtsxunterdevDependenciesgelandet? Was bedeutet das Zeichen^vor der Versionsnummer? Warum gehörtnode_modules/nicht ins Repository, diepackage-lock.jsondagegen schon? - Lösch
node_modules/und stell den Zustand mitnpm ciwieder her. Notiere inanswers.md, wohernpm ciweiß, welche Versionen es installieren soll.
Tipp:
npx tsc --initerzeugt einetsconfig.jsonvoller Kommentare. Das ist normal. Lass die Voreinstellungen stehen, wichtig ist vor allem, dass"strict": trueaktiv bleibt. Die Antworten zu^, Sperrdatei undnpm cifindest du im Kapitel npm: Pakete und Projekte, Abschnitt “Versionen: das Kernkonzept”.
Bewertungskriterien
Abschnitt betitelt „Bewertungskriterien“Vollständig, wenn:
npm ci,npm run devundnpm run typecheckim Projektordner fehlerfrei laufen.node_modules/nicht im Repository liegt,package.jsonundpackage-lock.jsonschon.answers.mdalle fünf Fragen fachlich richtig und in eigenen Worten beantwortet.- der absichtliche Typfehler als Kommentar in
hello.tssteht und inanswers.mderklärt ist, warum nurtypecheckihn meldet.
Wie unter Allgemein.
Wesentlich_vollständig
Abschnitt betitelt „Wesentlich_vollständig“Für alle, die in der Einheit mit den Schritten oben fertig sind bzw. optional (= freiwillig), wenn du in der Einheit nicht fertig wirst.
Aufgabe
Abschnitt betitelt „Aufgabe“Erweitere (siehe Erweitern in https://qiz.at/rules) den vollständigen Teil der vorherigen Stufe dieser Datei (ändere oder lösche nur, was für diese Aufgabe unbedingt notwendig ist):
- Lade die Vorlage
cheatsheet.mdin deinen Projektordner. Trag für jedes der fünf Konstrukte ein selbst getestetes Mini-Beispiel und einen Satz ein, wann du das Konstrukt verwendest:constundlet, Funktionsdeklaration und Arrow Function,map/filter/reducean einer Zahlenliste, Objektliteral (anlegen, Punktzugriff, Feld ergänzen) und Template-Literal mit eingebettetem Ausdruck. - Jedes Beispiel läuft vor dem Eintragen in der Node-REPL oder per
npx tsx. Ungeprüfte Beispiele haben auf dem Zettel nichts verloren. - Verteil Code auf zwei Dateien: Ein Modul exportiert mindestens eine Konstante und eine Funktion, eine zweite Datei
main.tsimportiert und verwendet sie. Stell das Skriptdevauftsx main.tsum.npm run devundnpm run typechecklaufen danach beide fehlerfrei.
Tipp: Meldet
npm run typecheckbeimimportden FehlerTS1295oderTS1287, steht in derpackage.jsonnoch"type": "commonjs". BeiTS2835: Relative import paths need explicit file extensionsfehlt die Endung: Imimportsteht.js, auch wenn die Datei.tsheißt (from "./clip-format.js"). Ein Beispiel für ein Modul findest du in Einheit 1.4 Moderne Sprachmittel, Abschnitt “Module”.
Bewertungskriterien
Abschnitt betitelt „Bewertungskriterien“Vollständig, wenn:
cheatsheet.mdalle fünf Konstrukte mit je einem lauffähigen Beispiel und einem Satz zur Verwendung enthält.- der Import über zwei Dateien funktioniert und
npm run devsowienpm run typecheckfehlerfrei laufen.
Wie unter Allgemein.
PlusPlus Aufgabe
Abschnitt betitelt „PlusPlus Aufgabe“Für alle, die in der Einheit mit den Schritten oben fertig sind bzw. optional (= freiwillig), wenn du in der Einheit nicht fertig wirst.
Aufgabe
Abschnitt betitelt „Aufgabe“Erweitere (siehe Erweitern in https://qiz.at/rules) den vollständigen Teil der vorherigen Stufe dieser Datei (ändere oder lösche nur, was für diese Aufgabe unbedingt notwendig ist):
- Schreib eine Datei
copies.ts, die ein Objekt mit Spread kopiert, dabei ein Feld überschreibt und zwei Objekte zusammenführt ({ ...object, field: value }). - Untersuche die Kopie: Ändere in der Kopie einmal ein einfaches Feld und einmal ein verschachteltes Array und vergleiche beide Male mit dem Original. Erkläre in einem Kommentar, warum sich das Original im zweiten Fall mit ändert, und zeig eine Kopie, bei der das nicht passiert.
- Zeig in derselben Datei einen Fall, in dem
||das Falsche täte und??das Richtige (0als gültiger Wert). - Schreib in
clip.tseininterface Clip(Dateiname, Dauer in Sekunden, optionale fps) und eine Funktion, die nur dieses Interface akzeptiert. Bau einen Tippfehler im Feldnamen ein und notiere als Kommentar die Compiler-Meldung im Original und in eigenen Worten.
Tipp: Wenn die flache Kopie “nicht funktioniert”, ist genau das die Beobachtung. Für den
??-Fall eignen sich Werte, bei denen0sinnvoll ist: Lautstärke, Anzahl, Rabatt. Einheit 1.4 zeigt die flache Kopie im Abschnitt “Spread und Rest”.
Bewertungskriterien
Abschnitt betitelt „Bewertungskriterien“Vollständig, wenn:
copies.tsbeide Änderungen an der Kopie zeigt, die Erklärung zum geteilten Array stimmt und eine tiefere Kopie das Original unverändert lässt.- der
||-gegen-??-Fall mit einem gültigen0am laufenden Code sichtbar ist (Ausgabe oderconsole.assert). - die Compiler-Meldung zum Tippfehler im Original und in einem eigenen Satz dokumentiert ist.
Wie unter Allgemein.
MandalorianPlus Aufgabe
Abschnitt betitelt „MandalorianPlus Aufgabe“Für alle, die in der Einheit mit den Schritten oben fertig sind bzw. optional (= freiwillig), wenn du in der Einheit nicht fertig wirst.
Aufgabe
Abschnitt betitelt „Aufgabe“Erweitere (siehe Erweitern in https://qiz.at/rules) den vollständigen Teil der vorherigen Stufe dieser Datei (ändere oder lösche nur, was für diese Aufgabe unbedingt notwendig ist):
- Zeig in
analysis.tsDestructuring von Objekt und Array, auch in einer Parameterliste, dazu je einmal Umbenennen ({ filename: name }), Standardwert ({ fps = 25 }) und Rest (...values) als Parameter. - Zeig
?.an einem verschachtelten Feld, das fehlen darf, kombiniert mit??für einen Ersatzwert. - Erweitere das Interface
Clipumtags: string[]und schreiblongestPerTag(clips: Clip[]): Map<string, Clip>: je Tag der längste Clip. - Definiere
type ClipState = "raw" | "editing" | "approved", erweitereClipdarum und schreibcountByState(clips: Clip[]): Record<ClipState, number>. Lass testweise einen Zustand im Ergebnisobjekt weg und notiere die Meldung des Compilers. - Löse eine der beiden Funktionen einmal mit Schleife und einmal mit
map/filter/reduceund vergleiche beide Fassungen in zwei Sätzen. - Beurteile in drei Sätzen, welche Prüfungen aus den beiden Funktionen TypeScript zur Compile-Zeit übernimmt und was ohne Typen erst zur Laufzeit (oder nie) aufgefallen wäre.
Tipp: Startet
reducemit einem leeren Objekt undas Record<...>, ist die Vollständigkeitsprüfung wieder ausgehebelt. Ein Typargument (clips.reduce<Record<ClipState, number>>(...)) prüft das Startobjekt.
Bewertungskriterien
Abschnitt betitelt „Bewertungskriterien“Vollständig, wenn:
- Destructuring, Umbenennen, Standardwert, Rest und
?.mit??lauffähig gezeigt sind. longestPerTagundcountByStatetypisiert sind und mit je zweiconsole.assertgetestet werden.- die Compiler-Meldung zum fehlenden Zustand dokumentiert ist.
- Vergleich und Beurteilung fachlich stichhaltig sind.
Wie unter Allgemein.
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Warum ändert sich nach
const copy = { ...original }undcopy.tags.push("x")auchoriginal.tags? - Wann liefert
value ?? "x"etwas anderes alsvalue || "x"? - Was gehört von
node_modules/,package.jsonundpackage-lock.jsonins Repository, und warum? - Was unterscheidet
npm installvonnpm ci, und wofür ist welcher Befehl gedacht? - Was prüft TypeScript beim Kompilieren, was bleibt Laufzeitverhalten?
- Was bedeutet der Fehler
Property 'durationSeconds' is missing in type ...? - Warum reicht es nicht, dass
npm run devfehlerfrei läuft, um zu wissen, dass die Typen stimmen?
Zeit dafür
Abschnitt betitelt „Zeit dafür“Durchschnittlich bis Wesentlich_vollständig: ca. 100 min
Autoren
Abschnitt betitelt „Autoren“- Oliver Maurhart (MAO)
- Michael Gabriel (GAM)
CC-BY-SA