Type inference adalah TypeScript yang menentukan tipe yang tidak kamu tulis. Inisialisasi variabel, dan variabel itu mengambil tipe nilainya; kembalikan nilai dari fungsi, dan tipe kembaliannya ikut menyesuaikan. Sebagian besar kode TypeScript punya anotasi jauh lebih sedikit daripada yang orang kira.
Komentarnya menunjukkan apa yang ditampilkan editor saat kamu mengarahkan kursor ke setiap nama. Baris terakhir adalah error kompilasi (TS2322) walaupun count tidak pernah diberi anotasi; // @ts-expect-error menandainya sebagai error yang memang diharapkan supaya sisa blok tetap berjalan.
let vs const: Pelebaran Literal
const tidak pernah bisa berubah, jadi TypeScript memberinya tipe tersempit: nilai literal itu sendiri. let mendapat tipe yang lebih lebar, karena nilainya mungkin diganti nanti.
let a = "left"; // string
const b = "left"; // "left"
let c = 42; // number
const d = 42; // 42
const e = true; // true
Ini penting ketika sebuah fungsi hanya menerima nilai tertentu:
index.ts(7,6): error TS2345: Argument of type 'string' is not assignable to parameter of type '"left" | "right"'.
Perbaiki dengan const, atau dengan memberi anotasi pada variabelnya: let dir: "left" | "right" = "left". Tipe literal dibahas tersendiri di halaman tipe literal.
Object dan Array Melebarkan Anggotanya
Property object literal bisa diubah, jadi tipenya melebar seperti let, bahkan ketika object itu sendiri const. Elemen array juga begitu. as const membuat semuanya readonly dan mempertahankan tipe literalnya.
Inferensi Tipe Kembalian
Tipe kembalian fungsi disimpulkan dari pernyataan return-nya. Kalau ada beberapa, hasilnya adalah union dari semuanya.
Tipe kembalian hasil inferensi sudah cukup untuk sebagian besar fungsi. Tulis tipe kembalian secara eksplisit pada fungsi yang di-export atau publik kalau kamu ingin signature-nya menjadi kontrak: perubahan di dalam isi fungsi yang mengembalikan tipe berbeda akan gagal di fungsi itu, bukan di pemanggil yang jauh.
Contextual Typing: Callback Mendapat Tipenya
Parameter tidak disimpulkan dari cara fungsi dipanggil. Ada dua pengecualian. Parameter dengan nilai default mengambil tipe nilai default itu (function retry(times = 3) membuat times bertipe number). Dan fungsi yang ditulis di tempat yang sudah mengharapkan tipe fungsi mendapat tipe parameternya dari konteks itu, jadi parameter callback tidak perlu anotasi.
Hal yang sama berlaku untuk forEach, filter, reduce, callback Promise, event handler, dan fungsi apa pun yang kamu berikan ke parameter dengan tipe fungsi yang sudah dideklarasikan.
Parameter Perlu Anotasi
Tanpa nilai default atau konteks seperti itu, TypeScript tidak melihat cara fungsi dipanggil untuk menebak tipe parameternya. Dengan strict aktif, parameter tanpa anotasi adalah error TS7006:
index.ts(2,17): error TS7006: Parameter 'x' implicitly has an 'any' type.
Tulis function double(x: number) dan blok itu mencetak 42, dengan tipe kembalian number yang disimpulkan dari x * 2.
Best Common Type
Untuk array literal dengan nilai yang jenisnya berbeda-beda, TypeScript menyimpulkan array dari union tipe-tipenya. TypeScript tidak mencari tipe dasar bersama yang tidak kamu sebutkan.
Array kosong adalah satu kasus yang perlu diwaspadai. const list = [] dimulai sebagai array yang "berkembang", yang tipenya bertambah setiap kali push; anotasi, const list: string[] = [], menyatakan maksudnya sejak awal dan lebih jelas.
Kapan Perlu Anotasi
| Situasi | Beri anotasi? |
|---|---|
| Variabel yang diinisialisasi dengan nilai | Tidak, nilainya memberi tipe |
Variabel yang dideklarasikan tanpa nilai (let result;) | Ya, let result: string; |
| Parameter fungsi | Ya (kecuali callback dengan konteks, atau nilai default) |
| Tipe kembalian fungsi internal yang kecil | Opsional |
| Tipe kembalian fungsi yang di-export atau publik | Disarankan, sebagai kontrak |
| Array atau object kosong yang diisi belakangan | Ya, const ids: number[] = [] |
| Nilai harus mempertahankan tipe literalnya | Pakai as const |
| Nilai harus cocok dengan sebuah tipe tapi tetap memakai tipe hasil inferensinya sendiri | Pakai satisfies |
Cara tercepat untuk melihat apa yang disimpulkan adalah mengarahkan kursor ke nama itu di editor. Tanpa editor, berikan nilai itu ke variabel dengan tipe yang salah, misalnya const probe: boolean = mixed;, dan pesan error compiler akan menyebutkan tipe hasil inferensinya.
Pertanyaan yang sering diajukan
Apa itu type inference di TypeScript?
Type inference adalah compiler yang menentukan tipe yang tidak kamu tulis. let count = 0 memberi count tipe number, dan fungsi yang mengembalikan a + b dari dua number mendapat tipe kembalian number. Tipe hasil inferensi diperiksa persis seperti tipe yang ditulis.
Apakah setiap variabel di TypeScript perlu diberi anotasi?
Tidak. Beri anotasi pada parameter fungsi (tipenya tidak disimpulkan dari pemanggilan, hanya dari nilai default atau konteks callback), tipe kembalian fungsi yang di-export kalau kamu ingin API yang stabil, dan variabel yang dideklarasikan tanpa nilai. Biarkan TypeScript menyimpulkan sisanya: const name: string = "Ada" hanya mengulang apa yang sudah diketahui compiler.
Kenapa const menghasilkan tipe literal sedangkan let menghasilkan string?
const tidak pernah bisa diberi nilai baru, jadi const dir = "left" mendapat tipe literal "left". let nantinya bisa berisi string lain, jadi let dir = "left" dilebarkan menjadi string. Pelebaran yang sama terjadi pada property object literal, karena property bisa diberi nilai baru; as const mencegahnya.
Kenapa TypeScript bilang parameter implicitly has an 'any' type?
Itu error TS7006 dari noImplicitAny, bagian dari strict. TypeScript tidak menyimpulkan tipe parameter dari cara fungsi dipanggil, jadi parameter tanpa tipe akan menjadi any. Tambahkan anotasi, function double(x: number), atau berikan fungsi itu di tempat yang tipenya sudah diketahui dari konteks, misalnya sebagai callback untuk map.
Bagaimana cara melihat tipe yang disimpulkan TypeScript?
Arahkan kursor ke nama itu di editor (VS Code dan sebagian besar editor menampilkan tipe hasil inferensi di tooltip). Di dalam kode, memberikan nilai itu ke variabel dengan tipe yang jelas salah membuat compiler mencetak tipe hasil inferensi di pesan error-nya.