Para convertir un string a número en TypeScript, llama a Number(text). El resultado tiene tipo number, y vale NaN cuando el texto no es un número válido. Para texto con caracteres al final, como "42px", usa parseInt(text, 10) o parseFloat(text).
Las cuatro conversiones devuelven el tipo number. TypeScript no sabe si el texto era válido; un string inválido sigue dando un number, cuyo valor es NaN.
Por qué hay que convertir
Los campos de formulario, los parámetros de URL, las variables de entorno y el contenido de los ficheros llegan como strings. TypeScript no te deja usar uno donde se espera un número:
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.
La aritmética con -, * y / sobre un string es un error. + está permitido pero concatena, así que "3" + 10 es el string "310"; por eso la conversión tiene que ir primero: Number(quantity) * 10.
Una aserción de tipo tampoco sirve. quantity as number se rechaza (TS2352), y forzarlo con as unknown as number solo silencia al compilador: el valor sigue siendo un string en tiempo de ejecución.
Number frente a parseInt, parseFloat y el + unario
Las cuatro funciones coinciden con una entrada limpia y discrepan en todo lo demás. Esta tabla es la salida real de cada una en Node:
| Entrada | 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 |
Las reglas detrás de la tabla:
Numbery el+unario son idénticos. Convierten el string entero tras quitar los espacios, entienden1e3y el hexadecimal0x, y devuelvenNaNsi sobra algo. Un string vacío o solo con espacios se convierte en0.parseIntyparseFloatleen desde el principio y se detienen en el primer carácter que no pueden usar, así que"42px"y"1,000"dan números parciales. Un string vacío esNaN.parseIntdescarta la parte decimal y no entiende exponentes:"1e3"se detiene en lae.- Los separadores numéricos (
12_000) son válidos en el código fuente, no en los strings.
Number es la opción más estricta para validar entradas. parseInt y parseFloat sirven para texto que de verdad lleva una unidad o un sufijo, como los tamaños de CSS.
Entradas inválidas: NaN
NaN tiene tipo number, así que el compilador nunca avisa de él. Comprueba tú el resultado, con Number.isNaN o Number.isFinite:
Devolver number | undefined hace que el fallo forme parte del tipo, así que cada llamada debe manejarlo antes de hacer aritmética. Number.isFinite también rechaza Infinity, que Number("Infinity") devuelve sin problema.
Evita el isNaN(x) global: convierte su argumento primero, así que en JavaScript isNaN("abc") es true. La declaración de TypeScript solo acepta un number, así que pasar un string es el error TS2345, una pista para usar Number.isNaN sobre un valor ya convertido.
String a entero
Pasa siempre a parseInt su segundo argumento, la base: 10 para texto decimal. Es opcional, pero documenta la intención e importa para otras bases. Para obtener un entero de un string decimal, convierte y luego redondea de forma explícita.
parseInt espera un string: parseInt(12.7) es un error de compilación (TS2345), y eso es útil, porque en JavaScript parseInt sobre un número lo convierte primero a texto y da respuestas erróneas con valores como 0.0000005 (devuelve 5). Usa Math.trunc para números. Para enteros mayores que Number.MAX_SAFE_INTEGER, BigInt(text) interpreta el valor completo (y lanza un SyntaxError con texto inválido en lugar de devolver NaN).
Número a string
Cualquiera de String(n), n.toString() y `${n}` convierte un número a su forma de string más corta. Los métodos de formato dan más control:
toFixed redondea el valor binario, no el decimal que escribiste, así que (1.005).toFixed(2) es "1.00": 1.005 se guarda como algo un poco menor que 1.005. Para dinero, guarda las cantidades como céntimos enteros o formatea con Intl.NumberFormat.
String(n) también funciona con null y undefined (da "null" y "undefined"), mientras que n.toString() sería un error de compilación con strict, porque el valor podría faltar.
Referencia rápida
| Tarea | Código | Tipo del resultado |
|---|---|---|
| String a número, estricto | Number(s) o +s | number (puede ser NaN) |
| Entero inicial de un texto | parseInt(s, 10) | number (puede ser NaN) |
| Decimal inicial de un texto | parseFloat(s) | number (puede ser NaN) |
| Comprobar el resultado | Number.isFinite(n), Number.isNaN(n) | boolean |
| Entero grande | BigInt(s) | bigint |
| Número a string | String(n), n.toString(), `${n}` | string |
| Decimales fijos | n.toFixed(2) | string |
| Otra base | n.toString(16) | string |
| Separadores de miles | n.toLocaleString("en-US") | string |
Preguntas frecuentes
¿Cómo convierto un string a número en TypeScript?
Usa Number(text). Devuelve un number: el valor si el texto es numérico válido, NaN para cualquier otra cosa y 0 para un string vacío o que solo tiene espacios. Usa parseInt(text, 10) o parseFloat(text) cuando el texto pueda llevar caracteres al final, como "42px".
¿Puedo convertir un string a número con as number?
as number?No. "42" as number es un error de compilación (TS2352), e incluso forzándolo a través de unknown, una aserción solo cambia el tipo que ve el compilador: en tiempo de ejecución el valor sigue siendo el string "42". Convierte el valor con Number(), parseInt() o parseFloat().
¿Qué diferencia hay entre Number() y parseInt() en TypeScript?
Number convierte el string entero y devuelve NaN si alguna parte no es numérica, así que Number("42px") es NaN. parseInt lee dígitos desde el principio y se detiene en el primer carácter que no es un dígito, así que parseInt("42px", 10) es 42, y descarta los decimales. Number("") es 0, mientras que parseInt("") es NaN.
¿Cómo compruebo si un string es un número válido?
Conviértelo y comprueba el resultado: const n = Number(text); if (text.trim() !== "" && Number.isFinite(n)) { ... }. La comprobación del string vacío importa porque Number("") es 0. Usa Number.isNaN, no el isNaN global, que de todos modos TypeScript solo acepta con un argumento number.
¿Cómo convierto un número a string en TypeScript?
String(n), n.toString() o un template literal `${n}` dan el mismo resultado. Usa n.toFixed(2) para un número fijo de decimales, n.toString(16) para otra base y n.toLocaleString("en-US") para separadores de miles.