Aufwärmen · Aufgabe 1 von 7
// B1.4 · ca. 30 Min. · Einstieg
Compilerfehler lesen: von der Meldung zur Korrektur
Nach dieser Lektion lesen Sie jede Meldung von tsc, beurteilen den Vorschlag "Did you mean" und arbeiten mehrere Fehler vom ersten an ab, bis zu der Zeile, die sie verursacht.
Danach können Sie
- Eine Meldung lesen: Position, TS-Code, Text, die eingerückte zweite Zeile und die Terminalform
- Fehler bei Namen, Eigenschaften und Argumenten beheben und einen Vorschlag "Did you mean" beurteilen
- Mehrere Fehler vom ersten an beheben, eine Ursache in einer Zeile ohne Fehler finden und tsc erneut ausführen
Vorhersagen · Aufgabe 2 von 7
Sagen Sie es vorher, bevor Sie weiterlesen: Welche Zeilen meldet tsc für diese main.ts?
let total = "0"; total++; const doubled: number = total * 2; console.log(total.toFixed(2), doubled);Üben · Aufgabe 3 von 7
In der Schleife stand sum += prise, und tsc meldete main.ts(4,10): error TS2552: Cannot find name 'prise'. Did you mean 'price'? Setzen Sie den Namen ein, damit tsc den Code annimmt und er 7 ausgibt.
const prices = [3, 4]; let sum = 0; for (const price of prices) { sum += ____; } console.log(sum);sum += ;Üben · Aufgabe 4 von 7
Dasselbe Programm. Sie dürfen eine Zeile ändern. Mit welcher Änderung meldet tsc überhaupt keine Fehler mehr?
let total = "0"; total++; const doubled: number = total * 2; console.log(total.toFixed(2), doubled);Üben · Aufgabe 5 von 7
tsc gibt main.ts(7,19): error TS2345: Argument of type 'string[]' is not assignable to parameter of type 'number[]'. und darunter eine eingerückte Zeile aus. Was steht in der eingerückten Zeile?
function total(prices: number[]): number { let sum = 0; for (const p of prices) sum += p; return sum; } const cart = ["3.5", "4.25"]; console.log(total(cart));Denksport · Aufgabe 6 von 7
Knobelaufgabe. Für diese Datei meldet tsc einen Fehler: main.ts(2,30): error TS1005: ')' expected. Sie ergänzen die fehlende ) und führen npx tsc erneut aus. Wie viele Fehler meldet es jetzt?
const count: number = "3"; console.log("count is", count; const label: string = 5;Anwenden · Aufgabe 7 von 7
Kleine Aufgabe. Legen Sie dieses Programm in main.ts ab und führen Sie npx tsc aus (oder prüfen Sie es im Editor). Es soll Fence: 13 m ausgeben. Beheben Sie nur die erste Meldung, führen Sie tsc erneut aus und wiederholen Sie das, bis tsc nichts mehr ausgibt. Notieren Sie, wie viele Fehler jeder Lauf gemeldet hat. Führen Sie dann node main.ts aus.
function perimeter(width: number, height: number): number { return 2 * (width + height); } let label = "Fence"; const sides = [4, 2.5]; const metres: number = "m"; console.log(lable + ":", perimeter(sides[0]), metres);Prüfen Sie Ihr Ergebnis anhand dieser Liste
Selbst programmieren
Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.
Ausgearbeitetes Beispiel
Eine Ursache, zwei Meldungen
In der ersten Fassung dieses Programms lautete die Zeile let total = 0; noch let total = "0";. tsc meldete dann main.ts(6,25): error TS2362 für total * 1.19 und main.ts(8,29): error TS2551 für total.toFixed(2), mit Did you mean 'fixed'?. Keine der beiden zeigte auf die Deklaration, und total += price wurde angenommen, weil man eine Zahl an Text anhängen darf. "0" in 0 zu ändern, behob beide. Führen Sie npx tsc aus, das nichts ausgibt, dann node main.ts. Setzen Sie danach die Anführungszeichen wieder ein und lesen Sie beide Meldungen selbst.
main.ts
const prices: number[] = [3.5, 4.25, 2];
let total = 0;
for (const price of prices) {
total += price;
}
const withTax: number = total * 1.19;
console.log("items:", prices.length);
console.log("total:", total.toFixed(2));
console.log("with tax:", withTax.toFixed(2));
Ausführen mit
npx tsc
node main.tsAusgabe
items: 3
total: 9.75
with tax: 11.60- Die Positionen in der Einleitung beziehen sich auf diese Datei: Zeile 6 enthält die Multiplikation, Zeile 8 den Aufruf von toFixed und Zeile 2 die Ursache.
- total += price besteht die Prüfung auch dann, wenn total Text ist; der erste Fehler erscheint deshalb erst bei der Multiplikation.
- Der Vorschlag 'fixed' ist eine echte String-Methode, aber ihr Aufruf gäbe keine Zahl mit zwei Nachkommastellen aus.
- Gibt tsc nichts aus, ist das das Signal für node main.ts.
Ändern und ausführen
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser den TypeScript-Compiler herunter (bis zu 2.1 MB) und speichert ihn im Cache. Ihr Code bleibt auf Ihrem Gerät.
Übungen
Übung 1 von 2
Die Liste abarbeiten
Dieses Programm soll Kitchen has 7 letters ausgeben, dann Floors: 1, dann Area: 12 m2 (der Raum ist 4 mal 3 Meter groß). tsc meldet drei Fehler. Führen Sie die Tests oder npx tsc aus, beheben Sie die erste Meldung, prüfen Sie erneut und machen Sie weiter, bis die Typprüfung besteht. Ändern Sie nur, worauf die Meldungen zeigen.
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser den TypeScript-Compiler herunter (bis zu 2.1 MB) und speichert ihn im Cache. Ihr Code bleibt auf Ihrem Gerät.
Hinweise
Hinweis 1
Die erste Meldung ist main.ts(6,7): error TS2322: Type 'string' is not assignable to type 'number'. "1" in Anführungszeichen ist Text.
Hinweis 2
Die zweite endet mit Did you mean 'length'? Hier stimmt der Vorschlag.
Hinweis 3
Expected 2 arguments, but got 1. heißt, dass area auch die Höhe braucht: area(4, 3).
Eine Lösung zeigen
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
function area(width: number, height: number): number {
return width * height;
}
let room = "Kitchen";
const floors: number = 1;
console.log(room, "has", room.length, "letters");
console.log("Floors:", floors);
console.log("Area:", area(4, 3), "m2");
Auf dem eigenen Computer ausführen
Installieren Sie TypeScript 7.0 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.ts
function area(width: number, height: number): number {
return width * height;
}
let room = "Kitchen";
const floors: number = "1";
console.log(room, "has", room.lenght, "letters");
console.log("Floors:", floors);
console.log("Area:", area(4), "m2");
main.test.ts
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {runMain} from './learnrun.js';
test('das Programm gibt die drei Zeilen aus', async () => {
const out = (await runMain()).trimEnd();
assert.equal(out, 'Kitchen has 7 letters\nFloors: 1\nArea: 12 m2', `das Programm gab ${JSON.stringify(out)} aus`);
});
test('die Flächenzeile benutzt beide Seiten des Raums', async () => {
const out = await runMain();
assert.match(out, /Area: 12 m2/, 'die letzte Zeile sollte Area: 12 m2 lauten');
});
package.json
{
"type": "module"
}
tsconfig.json
{
"compilerOptions": {
"target": "esnext",
"module": "nodenext",
"lib": [
"esnext",
"dom"
],
"types": [],
"strict": true,
"noEmit": true,
"erasableSyntaxOnly": true,
"verbatimModuleSyntax": true,
"allowImportingTsExtensions": true
},
"include": [
"**/*.ts"
],
"exclude": [
"**/*.test.ts"
]
}
npx tsc braucht TypeScript im Ordner: Führen Sie dort einmal npm install --save-dev typescript aus. tsc prüft die Typen; Node.js führt main.ts aus, indem es sie entfernt.
Programm ausführen:
npx tsc
node main.tsPrüfungen ausführen (learnrun.js muss im selben Ordner liegen):
npx tsc
node --testlearnrun.js herunterladenÜbung 2 von 2
Die Ursache beheben, nicht das Symptom
Dieses Programm soll Total: 8 und Average: 2.7 ausgeben. Es gibt Total: 0251 und Average: 83.7 aus, und tsc meldet einen Fehler, in Zeile 6. count in Zeile 6 in Number() zu packen, bringt tsc zum Schweigen, aber die Ausgabe bleibt falsch. Finden Sie die Zeile, die count zu Text macht, beheben Sie den Fehler dort und prüfen Sie, dass tsc und die Tests bestehen.
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser den TypeScript-Compiler herunter (bis zu 2.1 MB) und speichert ihn im Cache. Ihr Code bleibt auf Ihrem Gerät.
Hinweise
Hinweis 1
Die Meldung ist main.ts(6,25): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. Die linke Seite ist count.
Hinweis 2
Warum ist count keine Zahl? Sehen Sie nach, wo count seinen ersten Wert bekommt.
Hinweis 3
In Zeile 1 macht "0" in Anführungszeichen count zum String, also hängt count + n Text an. Schreiben Sie let count = 0;.
Eine Lösung zeigen
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
let count = 0;
const items = [2, 5, 1];
for (const n of items) {
count = count + n;
}
const average: number = count / items.length;
console.log("Total:", count);
console.log("Average:", average.toFixed(1));
Auf dem eigenen Computer ausführen
Installieren Sie TypeScript 7.0 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.ts
let count = "0";
const items = [2, 5, 1];
for (const n of items) {
count = count + n;
}
const average: number = count / items.length;
console.log("Total:", count);
console.log("Average:", average.toFixed(1));
main.test.ts
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {runMain} from './learnrun.js';
test('die Summe ist 8', async () => {
const out = await runMain();
assert.match(out, /^Total: 8$/m, `erwartet war die Zeile Total: 8, das Programm gab ${JSON.stringify(out)} aus`);
});
test('der Durchschnitt ist 2.7', async () => {
const out = await runMain();
assert.match(out, /^Average: 2\.7$/m, `erwartet war die Zeile Average: 2.7, das Programm gab ${JSON.stringify(out)} aus`);
});
package.json
{
"type": "module"
}
tsconfig.json
{
"compilerOptions": {
"target": "esnext",
"module": "nodenext",
"lib": [
"esnext",
"dom"
],
"types": [],
"strict": true,
"noEmit": true,
"erasableSyntaxOnly": true,
"verbatimModuleSyntax": true,
"allowImportingTsExtensions": true
},
"include": [
"**/*.ts"
],
"exclude": [
"**/*.test.ts"
]
}
npx tsc braucht TypeScript im Ordner: Führen Sie dort einmal npm install --save-dev typescript aus. tsc prüft die Typen; Node.js führt main.ts aus, indem es sie entfernt.
Programm ausführen:
npx tsc
node main.tsPrüfungen ausführen (learnrun.js muss im selben Ordner liegen):
npx tsc
node --testlearnrun.js herunterladenHäufige Fehler
Ein "Did you mean" übernehmen, das nicht passt
const prices: number[] = [3.5, 4.25, 2];
let total = "0";
for (const price of prices) {
total += price;
}
const withTax: number = total * 1.19;
console.log("items:", prices.length);
console.log("total:", total.toFixed(2));
console.log("with tax:", withTax.toFixed(2));
Was tsc oder Node.js ausgibt
main.ts(8,29): error TS2551: Property 'toFixed' does not exist on type 'string'. Did you mean 'fixed'?Warum, und die Lösung
tsc schlägt eine ähnlich geschriebene String-Methode vor, weil total ein String ist. toFixed in fixed umzubenennen, bestünde in dieser Zeile die Prüfung und gäbe Text in <tt>-Tags statt 9.75 aus. Lesen Sie zuerst den Typ in der Meldung: on type 'string' sagt Ihnen, dass total gar kein String sein sollte. Die Ursache ist Zeile 2: Schreiben Sie let total = 0;, und beide Fehler, in den Zeilen 6 und 8, verschwinden.
Hinter einem Syntaxfehler nach Typfehlern suchen
const count: number = "3";
console.log("count is", count;
const label: string = 5;
Was tsc oder Node.js ausgibt
main.ts(2,30): error TS1005: ')' expected.Warum, und die Lösung
Solange eine Klammer fehlt, kann tsc die Datei nicht lesen: Es meldet nur den Syntaxfehler und sagt nichts über Typen. Das heißt nicht, dass die Zeilen 1 und 3 stimmen. Ergänzen Sie die ) in Zeile 2, Spalte 30, führen Sie npx tsc erneut aus und beheben Sie dann die zwei Typfehler, die erscheinen: count bekommt 3 ohne Anführungszeichen, und label bekommt "5" oder einen anderen Typ.
Eine Funktion mit einem fehlenden Argument aufrufen
function area(width: number, height: number): number {
return width * height;
}
console.log(area(3));
Was tsc oder Node.js ausgibt
main.ts(4,13): error TS2554: Expected 2 arguments, but got 1.Warum, und die Lösung
In JavaScript wird ein fehlendes Argument stillschweigend zu undefined, und 3 * undefined gibt NaN aus. TypeScript zählt die Argumente gegen die Parameter und meldet den Aufruf. Spalte 13 ist die Stelle, an der area beginnt. Übergeben Sie beide Werte: area(3, 4).
TypeScript im Browser: der Compiler von TypeScript 6.0.3, Apache-2.0, danach die eigene Engine Ihres Browsers. Lizenz und Quellcode
Abschlussquiz
5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.
Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.