Untuk mengubah string menjadi number di TypeScript, panggil Number(text). Hasilnya bertipe number, dan nilainya NaN kalau teksnya bukan angka yang valid. Untuk teks dengan karakter tambahan di belakang, seperti "42px", pakai parseInt(text, 10) atau parseFloat(text).
Keempat konversi itu mengembalikan tipe number. TypeScript tidak tahu apakah teksnya valid; string yang tidak valid tetap menghasilkan number, yang nilainya NaN.
Kenapa Kamu Harus Mengonversi
Field form, parameter URL, environment variable, dan isi file datang sebagai string. TypeScript tidak mengizinkanmu memakainya di tempat yang mengharapkan number:
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.
Aritmetika dengan -, * dan / pada string adalah error. + diperbolehkan tetapi menyambung string, jadi "3" + 10 adalah string "310", itulah sebabnya konversi harus dilakukan lebih dulu: Number(quantity) * 10.
Type assertion juga tidak membantu. quantity as number ditolak (TS2352), dan memaksanya lewat as unknown as number hanya membungkam compiler: nilainya tetap string saat runtime.
Number vs parseInt vs parseFloat vs Unary Plus
Keempat fungsi ini sepakat pada input yang bersih dan berbeda pendapat pada semua input lainnya. Tabel ini adalah output nyata masing-masing di Node:
| Input | 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 |
Aturan di balik tabel ini:
Numberdan unary+identik. Keduanya mengonversi seluruh string setelah memangkas spasi, memahami1e3dan hex0x, dan mengembalikanNaNkalau masih ada sisa karakter. String kosong atau yang hanya berisi spasi menjadi0.parseIntdanparseFloatmembaca dari awal dan berhenti di karakter pertama yang tidak bisa dipakai, jadi"42px"dan"1,000"menghasilkan angka sebagian. String kosong menghasilkanNaN.parseIntmembuang bagian pecahan dan tidak memahami eksponen:"1e3"berhenti die.- Pemisah angka (
12_000) valid di kode sumber, tetapi tidak di dalam string.
Number adalah pilihan yang lebih ketat untuk memvalidasi input. parseInt dan parseFloat cocok untuk teks yang memang membawa satuan atau akhiran, seperti ukuran CSS.
Menangani Input yang Tidak Valid: NaN
NaN bertipe number, jadi compiler tidak pernah memperingatkanmu tentangnya. Cek hasilnya sendiri, dengan Number.isNaN atau Number.isFinite:
Mengembalikan number | undefined menjadikan kegagalan itu bagian dari tipe, jadi setiap pemanggil harus menanganinya sebelum melakukan aritmetika. Number.isFinite juga menolak Infinity, yang dengan senang hati dikembalikan oleh Number("Infinity").
Hindari isNaN(x) global: fungsi ini mengonversi argumennya lebih dulu, jadi isNaN("abc") bernilai true di JavaScript. Deklarasi TypeScript-nya hanya menerima number, jadi mengirim string adalah error TS2345, sebuah petunjuk untuk memakai Number.isNaN pada nilai yang sudah dikonversi.
String ke Integer
Selalu berikan argumen kedua ke parseInt, yaitu radix: 10 untuk teks desimal. Argumen ini opsional, tetapi mendokumentasikan maksudmu dan penting untuk basis lain. Untuk mendapatkan integer dari string desimal, konversi lalu bulatkan secara eksplisit.
parseInt mengharapkan string: parseInt(12.7) adalah error kompilasi (TS2345), dan itu berguna, karena di JavaScript parseInt pada sebuah number mengubahnya menjadi teks lebih dulu dan memberi jawaban yang salah untuk nilai seperti 0.0000005 (hasilnya 5). Pakai Math.trunc untuk number. Untuk integer di atas Number.MAX_SAFE_INTEGER, BigInt(text) mem-parse nilai lengkapnya (dan melempar SyntaxError pada teks yang tidak valid alih-alih mengembalikan NaN).
Number ke String
String(n), n.toString() maupun `${n}` sama-sama mengubah number menjadi bentuk string terpendeknya. Method pemformatan memberi kendali lebih:
toFixed membulatkan nilai binernya, bukan desimal yang kamu ketik, jadi (1.005).toFixed(2) adalah "1.00": 1.005 disimpan sebagai nilai yang sedikit lebih kecil dari 1,005. Untuk uang, simpan jumlahnya sebagai sen dalam integer atau format dengan Intl.NumberFormat.
String(n) juga berfungsi pada null dan undefined (menghasilkan "null" dan "undefined"), sedangkan n.toString() akan menjadi error kompilasi dengan strict, karena nilainya mungkin tidak ada.
Referensi Cepat
| Tugas | Kode | Tipe hasil |
|---|---|---|
| String ke number, ketat | Number(s) atau +s | number (mungkin NaN) |
| Integer di awal teks | parseInt(s, 10) | number (mungkin NaN) |
| Desimal di awal teks | parseFloat(s) | number (mungkin NaN) |
| Cek hasilnya | Number.isFinite(n), Number.isNaN(n) | boolean |
| Integer besar | BigInt(s) | bigint |
| Number ke string | String(n), n.toString(), `${n}` | string |
| Desimal tetap | n.toFixed(2) | string |
| Basis lain | n.toString(16) | string |
| Pemisah ribuan | n.toLocaleString("en-US") | string |
Pertanyaan yang sering diajukan
Bagaimana cara mengubah string menjadi number di TypeScript?
Pakai Number(text). Fungsi ini mengembalikan number: nilainya untuk teks angka yang valid, NaN untuk selain itu, dan 0 untuk string kosong atau yang hanya berisi spasi. Pakai parseInt(text, 10) atau parseFloat(text) kalau teksnya mungkin punya karakter tambahan di belakang seperti "42px".
Bisakah saya melakukan cast string ke number dengan as number?
Tidak. "42" as number adalah error kompilasi (TS2352), dan bahkan kalau dipaksa lewat unknown, assertion hanya mengubah tipe yang dilihat compiler: nilainya tetap string "42" saat runtime. Konversi nilainya dengan Number(), parseInt() atau parseFloat().
Apa perbedaan Number() dan parseInt() di TypeScript?
Number mengonversi seluruh string dan mengembalikan NaN kalau ada bagian yang bukan angka, jadi Number("42px") adalah NaN. parseInt membaca digit dari awal dan berhenti di karakter pertama yang bukan digit, jadi parseInt("42px", 10) adalah 42, dan ia membuang bagian desimal. Number("") adalah 0, sedangkan parseInt("") adalah NaN.
Bagaimana cara mengecek apakah sebuah string adalah angka yang valid?
Konversi lalu uji hasilnya: const n = Number(text); if (text.trim() !== "" && Number.isFinite(n)) { ... }. Pengecekan string kosong itu penting karena Number("") adalah 0. Pakai Number.isNaN, bukan isNaN global, yang lagi pula hanya diterima TypeScript dengan argumen bertipe number.
Bagaimana cara mengubah number menjadi string di TypeScript?
String(n), n.toString() atau template literal `${n}` semuanya memberi hasil yang sama. Pakai n.toFixed(2) untuk jumlah desimal yang tetap, n.toString(16) untuk basis lain, dan n.toLocaleString("en-US") untuk pemisah ribuan.