Para converter uma string em número no TypeScript, chame Number(text). O resultado tem o tipo number e é NaN quando o texto não é um número válido. Para texto com caracteres no final, como "42px", use parseInt(text, 10) ou parseFloat(text).
As quatro conversões retornam o tipo number. O TypeScript não sabe se o texto era válido; uma string inválida ainda gera um number, cujo valor é NaN.
Por que é preciso converter
Campos de formulário, parâmetros de URL, variáveis de ambiente e conteúdo de arquivos chegam como strings. O TypeScript não deixa você usar uma string onde se espera um 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.
Aritmética com -, * e / em uma string é erro. + é permitido, mas concatena, então "3" + 10 é a string "310"; por isso a conversão precisa vir primeiro: Number(quantity) * 10.
Uma type assertion também não resolve. quantity as number é rejeitado (TS2352), e forçar com as unknown as number só silencia o compilador: em tempo de execução o valor continua sendo uma string.
Number vs parseInt vs parseFloat vs + unário
As quatro funções concordam em entradas limpas e discordam em todo o resto. Esta tabela mostra a saída real de cada uma no 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 |
As regras por trás da tabela:
Numbere o+unário são idênticos. Eles convertem a string inteira depois de remover os espaços das pontas, entendem1e3e hexadecimal com0xe retornamNaNse sobrar alguma coisa. Uma string vazia ou só com espaços vira0.parseInteparseFloatleem a partir do início e param no primeiro caractere que não conseguem usar, então"42px"e"1,000"dão números parciais. Uma string vazia éNaN.parseIntdescarta a parte fracionária e não entende expoentes:"1e3"para noe.- Separadores numéricos (
12_000) são válidos no código-fonte, não em strings.
Number é a opção mais rígida para validar entradas. parseInt e parseFloat servem para texto que de fato traz uma unidade ou sufixo, como tamanhos em CSS.
Tratando entradas inválidas: NaN
NaN tem o tipo number, então o compilador nunca avisa sobre ele. Verifique o resultado você mesmo, com Number.isNaN ou Number.isFinite:
Retornar number | undefined torna a falha parte do tipo, então todo código que chama a função precisa tratá-la antes de fazer contas. Number.isFinite também rejeita Infinity, que Number("Infinity") retorna sem reclamar.
Evite o isNaN(x) global: ele converte o argumento primeiro, então isNaN("abc") é true no JavaScript. A declaração do TypeScript só aceita um number, então passar uma string é o erro TS2345, um sinal para usar Number.isNaN em um valor já convertido.
String para inteiro
Sempre passe o segundo argumento de parseInt, a base: 10 para texto decimal. Ele é opcional, mas deixa a intenção clara e faz diferença em outras bases. Para obter um inteiro de uma string decimal, converta e depois arredonde explicitamente.
parseInt espera uma string: parseInt(12.7) é um erro de compilação (TS2345), o que é útil, porque no JavaScript parseInt em um número primeiro o converte em texto e dá respostas erradas para valores como 0.0000005 (retorna 5). Use Math.trunc para números. Para inteiros acima de Number.MAX_SAFE_INTEGER, BigInt(text) lê o valor completo (e lança um SyntaxError para texto inválido em vez de retornar NaN).
Número para string
Qualquer um entre String(n), n.toString() e `${n}` converte um número na sua forma de string mais curta. Os métodos de formatação dão mais controle:
toFixed arredonda o valor binário, não o decimal que você digitou, então (1.005).toFixed(2) é "1.00": 1.005 é armazenado como um pouco menos que 1.005. Para dinheiro, guarde os valores como centavos inteiros ou formate com Intl.NumberFormat.
String(n) também funciona com null e undefined (gerando "null" e "undefined"), enquanto n.toString() seria um erro de compilação com strict, já que o valor pode estar ausente.
Referência rápida
| Tarefa | Código | Tipo do resultado |
|---|---|---|
| String para número, rígido | Number(s) ou +s | number (pode ser NaN) |
| Inteiro no início do texto | parseInt(s, 10) | number (pode ser NaN) |
| Decimal no início do texto | parseFloat(s) | number (pode ser NaN) |
| Verificar o resultado | Number.isFinite(n), Number.isNaN(n) | boolean |
| Inteiro grande | BigInt(s) | bigint |
| Número para string | String(n), n.toString(), `${n}` | string |
| Casas decimais fixas | n.toFixed(2) | string |
| Outra base | n.toString(16) | string |
| Separadores de milhar | n.toLocaleString("en-US") | string |
Perguntas frequentes
Como converter uma string em número no TypeScript?
Use Number(text). Ele retorna um number: o valor para texto numérico válido, NaN para qualquer outra coisa e 0 para uma string vazia ou só com espaços. Use parseInt(text, 10) ou parseFloat(text) quando o texto pode ter caracteres no final, como "42px".
Posso converter uma string em número com as number?
as number?Não. "42" as number é um erro de compilação (TS2352) e, mesmo forçando por unknown, uma assertion muda só o tipo que o compilador enxerga: em tempo de execução o valor continua sendo a string "42". Converta o valor com Number(), parseInt() ou parseFloat().
Qual é a diferença entre Number() e parseInt() no TypeScript?
Number converte a string inteira e retorna NaN se alguma parte não for numérica, então Number("42px") é NaN. parseInt lê dígitos a partir do início e para no primeiro caractere que não é dígito, então parseInt("42px", 10) é 42, e ele descarta as casas decimais. Number("") é 0, enquanto parseInt("") é NaN.
Como verificar se uma string é um número válido?
Converta e teste o resultado: const n = Number(text); if (text.trim() !== "" && Number.isFinite(n)) { ... }. A verificação da string vazia importa porque Number("") é 0. Use Number.isNaN, e não o isNaN global, que de qualquer forma o TypeScript só aceita com um argumento number.
Como converter um número em string no TypeScript?
String(n), n.toString() ou um template literal `${n}` dão o mesmo resultado. Use n.toFixed(2) para um número fixo de casas decimais, n.toString(16) para outra base e n.toLocaleString("en-US") para separadores de milhar.