Zum Inhalt springen
aviral gupta

// B1.1 · ca. 30 Min. · Einstieg

Warum statische Typen: Fehler finden, bevor das Programm läuft

Nach dieser Lektion wissen Sie, was tsc vor dem Programmstart prüft, setzen Typannotationen dort, wo sie nötig sind, und beheben mit einer Meldung wie error TS2322 die Zeile, die sie nennt.

Lektion 1 von 5 in B1 Einrichtung und Grundlagen

Anfang des Moduls

Danach können Sie

  • Erklären, was tsc vor dem Programmstart prüft und warum node main.ts allein keine Typen prüft
  • Variablen und Parameter annotieren und Annotationen weglassen, wo TypeScript den Typ ableitet
  • Eine Meldung von tsc lesen: Datei, Zeile und Spalte, den TS-Code und den Text
  1. Aufwärmen · Aufgabe 1 von 7

    Aufwärmen aus JavaScript: Was trifft auf ein einfaches JavaScript-Programm zu? Wählen Sie alle zutreffenden.

    Wählen Sie alle zutreffenden aus.

  2. Vorhersagen · Aufgabe 2 von 7

    Sagen Sie es vorher, bevor Sie weiterlesen: Sie führen npx tsc für diese main.ts aus. Was meldet es?

    function double(n: number) {
      return n * 2;
    }
    
    console.log(double("21"));
  3. Üben · Aufgabe 3 von 7

    Setzen Sie den Typ von width ein, damit tsc die Funktion akzeptiert und sie 12 ausgibt.

    function area(width: ____, height: number): number {
      return width * height;
    }
    
    console.log(area(3, 4));
    function area(width: , height: number): number {
  4. Üben · Aufgabe 4 von 7

    Hier ist nichts annotiert. Was meldet tsc?

    let price = 4.5;
    price = "free";
  5. Üben · Aufgabe 5 von 7

    tsc gibt main.ts(5,20): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'. aus. Ordnen Sie jedem Teil zu, was er Ihnen sagt.

  6. Denksport · Aufgabe 6 von 7

    Knobelaufgabe. tsc lehnt diese Datei ab, aber Sie überspringen tsc und führen node main.ts aus. Was gibt es aus?

    const count: number = "3";
    console.log(count + 1);
  7. Anwenden · Aufgabe 7 von 7

    Mini-Aufgabe. Schreiben Sie eine Funktion formatPrice, die einen Betrag und eine Währung nimmt und Text wie 4.50 EUR zurückgibt (amount.toFixed(2) liefert die zwei Nachkommastellen). Annotieren Sie beide Parameter und den Rückgabetyp und rufen Sie die Funktion einmal mit console.log auf. Prüfen Sie das im Editor, oder mit npx tsc und node main.ts, wenn Sie TypeScript installiert haben. Übergeben Sie dann "4.5" statt 4.5 und lesen Sie die Meldung.

    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 geprüfte Einkaufssumme

Dieses Programm addiert drei Preise und schlägt 19 % Steuer auf. Das Array und die Parameter der Funktion sind annotiert; total nicht, weil TypeScript aus dem ersten Wert number ableitet. Führen Sie npx tsc aus: Es gibt nichts aus, also gibt es keine Fehler. Dann node main.ts. Übergeben Sie probeweise "0.19" als Steuersatz und starten Sie tsc erneut. Die nächste Lektion installiert TypeScript 7.0; der Editor auf dieser Seite prüft mit TypeScript 6.0, das für jedes Programm dieser Lektion dieselben Fehler meldet.

main.ts

// A shopping total. tsc checks every use of these values before node runs them.
const prices: number[] = [3.5, 4.25, 2];
let total = 0; // no annotation: TypeScript infers number

function addTax(amount: number, rate: number): number {
  return amount * (1 + rate);
}

for (const price of prices) {
  total += price;
}

console.log("items:", prices.length);
console.log("total:", total);
console.log("with 19% tax:", addTax(total, 0.19).toFixed(2));

Ausführen mit

npx tsc
node main.ts

Ausgabe

items: 3
total: 9.75
with 19% tax: 11.60
  • number[] bedeutet ein Array aus Zahlen; Text in prices einzufügen wäre ein Typfehler.
  • total hat keine Annotation, und trotzdem behandelt TypeScript es überall darunter als Zahl.
  • Wenn Node.js die Datei ausführt, sind die Annotationen weg: Die Ausgabe ist die, die dasselbe JavaScript liefern würde.
  • toFixed(2) liefert Text mit zwei Nachkommastellen; deshalb zeigt die letzte Zeile 11.60.
Ä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 Parameter annotieren

Diese Funktion funktioniert in JavaScript, aber tsc lehnt sie ab: Parameter 'width' implicitly has an 'any' type, und dasselbe für height. Annotieren Sie beide Parameter als Zahlen, dazu den Rückgabetyp. Starten Sie die Tests: Der erste ist die Typprüfung.

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
  1. Hinweis 1

    Eine Annotation steht nach dem Namen, mit Doppelpunkt: width: number.

  2. Hinweis 2

    Der Rückgabetyp steht nach der schließenden Klammer der Parameterliste: (…): number {

  3. Hinweis 3

    Die fertige erste Zeile lautet export function area(width: number, height: number): number {

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

export function area(width: number, height: number): number {
  return width * height;
}
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

export function area(width, height) {
  return width * height;
}

main.test.ts

import {test} from 'node:test';
import assert from 'node:assert/strict';
import {area} from './main.ts';

test('area(3, 4) ist 12', () => {
  assert.equal(area(3, 4), 12, 'area(3, 4) sollte 12 sein');
});

test('area(2.5, 2) ist 5', () => {
  assert.equal(area(2.5, 2), 5, 'area(2.5, 2) sollte 5 sein');
});

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.ts

Prüfungen ausführen (learnrun.js muss im selben Ordner liegen):

npx tsc
node --test
learnrun.js herunterladen

Übung 2 von 2

Beheben, was tsc meldet

Dieses Programm soll Points: 42 ausgeben, gibt aber Points: 402 aus, und tsc meldet zwei Fehler. Starten Sie die Tests oder npx tsc, gehen Sie zu jeder Zeile und Spalte, die die Meldungen nennen, und korrigieren Sie dort die Werte. Lassen Sie die Funktion, wie sie ist: Sie stimmt.

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
  1. Hinweis 1

    Die erste Meldung ist main.ts(6,7): error TS2322. Zeile 6 speichert Text in einer Variablen, die als number annotiert ist.

  2. Hinweis 2

    Die zweite, in Zeile 7, betrifft saved: TypeScript hat aus "40" den Typ string abgeleitet.

  3. Hinweis 3

    Entfernen Sie die Anführungszeichen: Zahlen schreibt man ohne, als 40 und 2.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

export function addPoints(a: number, b: number): number {
  return a + b;
}

const saved = 40;
const bonus: number = 2;
console.log("Points:", addPoints(saved, bonus));
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

export function addPoints(a: number, b: number): number {
  return a + b;
}

const saved = "40";
const bonus: number = "2";
console.log("Points:", addPoints(saved, bonus));

main.test.ts

import {test} from 'node:test';
import assert from 'node:assert/strict';
import {runMain} from './learnrun.js';
import {addPoints} from './main.ts';

test('addPoints(40, 2) ist 42', () => {
  assert.equal(addPoints(40, 2), 42, 'addPoints(40, 2) sollte 42 sein');
});

test('das Programm gibt Points: 42 aus', async () => {
  const out = (await runMain()).trimEnd();
  assert.equal(out, 'Points: 42', `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.ts

Prüfungen ausführen (learnrun.js muss im selben Ordner liegen):

npx tsc
node --test
learnrun.js herunterladen

Häufige Fehler

Text in einer Variablen, die als Zahl annotiert ist

let count: number = 0;
count = "1";
console.log(count);

Was tsc oder Node.js ausgibt

main.ts(2,1): error TS2322: Type 'string' is not assignable to type 'number'.

Warum, und die Lösung

count ist eine Zahl und kann darum immer nur Zahlen aufnehmen. "1" in Anführungszeichen ist Text. Zeile 2, Spalte 1 ist die Stelle, an der der Text zugewiesen wird. Schreiben Sie count = 1 ohne Anführungszeichen. Wenn Sie wirklich Text in eine Zahl umwandeln müssen, tun Sie das mit Number("1").

Ein Parameter ohne Typ

function greet(name) {
  return "Hello, " + name;
}

console.log(greet("Ada"));

Was tsc oder Node.js ausgibt

main.ts(1,16): error TS7006: Parameter 'name' implicitly has an 'any' type.

Warum, und die Lösung

Mit strict rät TypeScript nicht, was ein Parameter enthält, und macht ihn auch nicht stillschweigend zu any, was die Prüfung für ihn abschalten würde. Sagen Sie, was Sie erwarten: function greet(name: string). Dann wird auch der Aufruf greet("Ada") geprüft.

Ein Tippfehler im Methodennamen

let city = "Berlin";
console.log(city.toUppercase());

Was tsc oder Node.js ausgibt

main.ts(2,18): error TS2551: Property 'toUppercase' does not exist on type 'string'. Did you mean 'toUpperCase'?

Warum, und die Lösung

Namen unterscheiden Groß- und Kleinschreibung, und TypeScript kennt jede Methode eines Strings. Es meldet den Tippfehler, bevor das Programm läuft, und schlägt den richtigen Namen vor. Ohne tsc stoppt node main.ts erst, wenn es die Zeile erreicht, mit TypeError: city.toUppercase is not a function. Schreiben Sie toUpperCase.

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.

Problem melden

Etwas ist falsch oder unklar? Beschreiben Sie es kurz, dann wird es geprüft und korrigiert.

#

Mindestens 20 Zeichen.

Nur, wenn Sie eine Antwort wünschen.

Kernideen

Typen werden geprüft, bevor das Programm läuft

JavaScript erfährt erst während des Laufs, was ein Wert ist. double("21") ergibt stillschweigend 42, und ein Fehler in einer Zeile, die nie läuft, wird nie gemeldet. TypeScript ist JavaScript plus Typen. Sein Typprüfer, tsc, liest das ganze Programm, ohne es auszuführen, und meldet jede Stelle, an der ein Wert nicht zu dem passt, was der Code sagt, etwa Text, wo eine Zahl erwartet wird. Das ist statische Prüfung: vor dem Lauf, nicht währenddessen. Ein Beweis, dass das Programm stimmt, ist das nicht. a + b / 2 besteht die Prüfung und liefert trotzdem den falschen Durchschnitt: tsc prüft, ob die Typen zusammenpassen, nicht, ob die Logik tut, was Sie meinten.

Annotationen, Typableitung und Typen, die verschwinden

Eine Annotation ist ein Doppelpunkt und ein Typ nach einem Namen: let count: number = 0 oder function area(width: number, height: number): number. Parameter brauchen meist eine, denn TypeScript kann nicht raten, was Aufrufer übergeben: Mit strict ist ein einfacher Parameter ohne Annotation ein Fehler. Variablen meist nicht: Bei let total = 0 leitet TypeScript number ab, und ein späteres total = "ten" ist trotzdem ein Fehler. Wenn Node.js main.ts ausführt, ersetzt es die Typen durch Leerraum und führt den Rest aus, ohne etwas zu prüfen. Typen ändern nie, was das Programm tut, und node main.ts führt auch Code mit Typfehlern aus. Deshalb kommt npx tsc zuerst.

Der Projektordner und wie man eine Meldung liest

Der Kursordner enthält main.ts, eine package.json mit {"type": "module"} und diese 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"]}. Führen Sie npx tsc aus, das die tsconfig.json selbst findet und nur prüft (noEmit), dann node main.ts, als zwei Befehle. Gibt tsc nichts aus, gibt es keine Fehler. Sonst sieht jede Zeile so aus: main.ts(5,20): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'. Das sind die Datei, Zeile 5, Spalte 20, der Fehlercode und der Text: welcher Typ gefunden, welcher erwartet wurde.

Quellen

Zuletzt geprüft am 30. September 2026