Um in TypeScript einen String in eine Zahl umzuwandeln, rufst du Number(text) auf. Das Ergebnis hat den Typ number und ist NaN, wenn der Text keine gültige Zahl ist. Für Text mit nachfolgenden Zeichen wie "42px" nimmst du parseInt(text, 10) oder parseFloat(text).
Alle vier Umwandlungen liefern den Typ number. TypeScript weiß nicht, ob der Text gültig war; ein ungültiger String ergibt trotzdem eine number, deren Wert NaN ist.
Warum du umwandeln musst
Formularfelder, URL-Parameter, Umgebungsvariablen und Dateiinhalte kommen als Strings an. TypeScript lässt dich keinen davon dort verwenden, wo eine Zahl erwartet wird:
index.ts(3,23): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
Rechnen mit -, * und / auf einem String ist ein Fehler. + ist erlaubt, verkettet aber, also ist "3" + 10 der String "310". Deshalb muss die Umwandlung zuerst kommen: Number(quantity) * 10.
Eine Typ-Assertion hilft auch nicht. quantity as number wird abgelehnt (TS2352), und es über as unknown as number zu erzwingen, bringt nur den Compiler zum Schweigen: Zur Laufzeit bleibt der Wert ein String.
Number vs parseInt vs parseFloat vs unäres Plus
Die vier Funktionen stimmen bei sauberer Eingabe überein und unterscheiden sich bei allem anderen. Diese Tabelle zeigt die echte Ausgabe jeder Funktion unter Node:
| Eingabe | Number(s) | +s | parseInt(s, 10) | parseFloat(s) |
|---|---|---|---|---|
"42" | 42 | 42 | 42 | 42 |
"3.99" | 3.99 | 3.99 | 3 | 3.99 |
"42px" | NaN | NaN | 42 | 42 |
"" | 0 | 0 | NaN | NaN |
" 3 " | 3 | 3 | 3 | 3 |
"1e3" | 1000 | 1000 | 1 | 1000 |
"0x1F" | 31 | 31 | 0 | 0 |
"1,000" | NaN | NaN | 1 | 1 |
"12_000" | NaN | NaN | 12 | 12 |
"abc" | NaN | NaN | NaN | NaN |
Die Regeln hinter der Tabelle:
Numberund unäres+sind identisch. Sie wandeln den ganzen String nach dem Entfernen von Leerzeichen um, verstehen1e3und hexadezimales0xund gebenNaNzurück, wenn etwas übrig bleibt. Ein leerer oder nur aus Leerzeichen bestehender String wird zu0.parseIntundparseFloatlesen vom Anfang und hören beim ersten Zeichen auf, das sie nicht verwenden können, deshalb liefern"42px"und"1,000"Teilzahlen. Ein leerer String ergibtNaN.parseIntverwirft den Nachkommaanteil und versteht keine Exponenten:"1e3"endet beime.- Numerische Trennzeichen (
12_000) sind im Quellcode gültig, nicht in Strings.
Number ist die strengere Wahl, um Eingaben zu validieren. parseInt und parseFloat passen zu Text, der tatsächlich eine Einheit oder ein Suffix trägt, etwa CSS-Größen.
Ungültige Eingaben behandeln: NaN
NaN hat den Typ number, deshalb warnt der Compiler nie davor. Prüfe das Ergebnis selbst, mit Number.isNaN oder Number.isFinite:
Wenn die Funktion number | undefined zurückgibt, wird der Fehlschlag Teil des Typs, und jeder Aufrufer muss ihn behandeln, bevor er rechnet. Number.isFinite lehnt auch Infinity ab, das Number("Infinity") bereitwillig zurückgibt.
Vermeide das globale isNaN(x): Es wandelt sein Argument erst um, daher ist isNaN("abc") in JavaScript true. Die Deklaration in TypeScript akzeptiert nur eine number, einen String zu übergeben ist also der Fehler TS2345. Das ist ein Hinweis, Number.isNaN auf einen bereits umgewandelten Wert anzuwenden.
String in Integer
Übergib parseInt immer das zweite Argument, die Basis: 10 für Dezimaltext. Es ist optional, dokumentiert aber die Absicht und ist bei anderen Basen wichtig. Um aus einem Dezimalstring eine ganze Zahl zu bekommen, wandle um und runde dann ausdrücklich.
parseInt erwartet einen String: parseInt(12.7) ist ein Compilerfehler (TS2345). Das ist nützlich, denn in JavaScript wandelt parseInt eine Zahl zuerst in Text um und liefert bei Werten wie 0.0000005 falsche Ergebnisse (es gibt 5 zurück). Für Zahlen nimmst du Math.trunc. Für ganze Zahlen jenseits von Number.MAX_SAFE_INTEGER liest BigInt(text) den vollen Wert (und wirft bei ungültigem Text einen SyntaxError, statt NaN zurückzugeben).
Zahl in String
String(n), n.toString() und `${n}` wandeln eine Zahl jeweils in ihre kürzeste String-Form um. Formatierungsmethoden geben mehr Kontrolle:
toFixed rundet den binären Wert, nicht die Dezimalzahl, die du getippt hast, deshalb ist (1.005).toFixed(2) gleich "1.00": 1.005 wird als etwas weniger als 1.005 gespeichert. Für Geldbeträge speicherst du ganze Cent oder formatierst mit Intl.NumberFormat.
String(n) funktioniert auch mit null und undefined (ergibt "null" und "undefined"), während n.toString() unter strict ein Compilerfehler wäre, da der Wert fehlen könnte.
Kurzreferenz
| Aufgabe | Code | Ergebnistyp |
|---|---|---|
| String in Zahl, streng | Number(s) oder +s | number (evtl. NaN) |
| Führende ganze Zahl aus Text | parseInt(s, 10) | number (evtl. NaN) |
| Führende Dezimalzahl aus Text | parseFloat(s) | number (evtl. NaN) |
| Ergebnis prüfen | Number.isFinite(n), Number.isNaN(n) | boolean |
| Große ganze Zahl | BigInt(s) | bigint |
| Zahl in String | String(n), n.toString(), `${n}` | string |
| Feste Nachkommastellen | n.toFixed(2) | string |
| Andere Basis | n.toString(16) | string |
| Tausendertrennzeichen | n.toLocaleString("en-US") | string |
Häufig gestellte Fragen
Wie wandle ich in TypeScript einen String in eine Zahl um?
Mit Number(text). Das Ergebnis ist eine number: der Wert bei gültigem numerischem Text, NaN bei allem anderen und 0 bei einem leeren oder nur aus Leerzeichen bestehenden String. Nimm parseInt(text, 10) oder parseFloat(text), wenn der Text nachfolgende Zeichen wie "42px" enthalten kann.
Kann ich einen String mit as number in eine Zahl casten?
as number in eine Zahl casten?Nein. "42" as number ist ein Compilerfehler (TS2352), und selbst wenn man es über unknown erzwingt, ändert eine Assertion nur den Typ, den der Compiler sieht: Zur Laufzeit ist der Wert weiterhin der String "42". Wandle den Wert mit Number(), parseInt() oder parseFloat() um.
Was ist der Unterschied zwischen Number() und parseInt() in TypeScript?
Number wandelt den ganzen String um und gibt NaN zurück, sobald ein Teil nicht numerisch ist, also ist Number("42px") gleich NaN. parseInt liest Ziffern vom Anfang und hört beim ersten Nicht-Ziffernzeichen auf, also ist parseInt("42px", 10) gleich 42, und Nachkommastellen fallen weg. Number("") ist 0, parseInt("") dagegen NaN.
Wie prüfe ich, ob ein String eine gültige Zahl ist?
Wandle ihn um und prüfe das Ergebnis: const n = Number(text); if (text.trim() !== "" && Number.isFinite(n)) { ... }. Die Prüfung auf den leeren String ist wichtig, weil Number("") gleich 0 ist. Nutze Number.isNaN, nicht das globale isNaN, das TypeScript ohnehin nur mit einem number-Argument akzeptiert.
Wie wandle ich in TypeScript eine Zahl in einen String um?
String(n), n.toString() und ein Template-Literal `${n}` liefern dasselbe Ergebnis. Nimm n.toFixed(2) für eine feste Anzahl von Nachkommastellen, n.toString(16) für eine andere Basis und n.toLocaleString("en-US") für Tausendertrennzeichen.