Typescript Tsconfig Module Resolution Path Aliases Declaration Files Build Targets
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama TypeScript untuk melanjutkan topik lainnya.
Kembali ke rujukan utama TypeScript untuk melanjutkan topik lainnya.
tsconfig.json adalah file konfigurasi utama TypeScript. Di sini kamu mengatur bagaimana compiler membaca source, mencari modul, memeriksa tipe, dan mengeluarkan hasil build.
Lima area yang paling sering berubah di project nyata adalah:
compilerOptions: pusat semua perilaku compiler.import..d.ts yang menyimpan bentuk tipe tanpa JavaScript runtime.Kalau konfigurasi TypeScript mulai membesar, masalah biasanya bukan karena TypeScript-nya, tapi karena hubungan antarbagian ini tidak lagi selaras.
compilerOptionscompilerOptions adalah tempat kamu mengatur perilaku inti compiler. Hampir semua hal penting di project TypeScript masuk ke sini.
Contoh opsi yang paling sering dipakai:
target: output JavaScript yang ingin dihasilkan, misalnya ES2020 atau ESNext.module: format modul output, misalnya CommonJS, ESNext, atau NodeNext.moduleResolution: strategi pencarian modul.baseUrl dan paths: dasar untuk alias path.outDir dan rootDir: arah input dan output build.declaration: apakah TypeScript menghasilkan .d.ts.strict: kumpulan pengecekan tipe yang lebih ketat.esModuleInterop dan allowSyntheticDefaultImports: membantu interop dengan modul CommonJS.Intinya begini: compilerOptions bukan hanya daftar preferensi. Ia menentukan bagaimana TypeScript memahami source, menafsirkan import, dan menghasilkan artefak build.
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "Bundler",
"strict": true,
"declaration": true,
"outDir": "dist",
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
Path aliases membantu saat import mulai terlalu dalam atau terlalu rapuh.
../../../../components/Button@components, @lib, @featuresTanpa alias:
import { formatDate } from '../../../../lib/date/format-date';Dengan alias:
import { formatDate } from '@/lib/date/format-date';@/domain, @/ui, @/server, dan seterusnya.Alias di tsconfig.json tidak otomatis dipahami runtime. Ini jebakan yang paling sering.
Artinya:
Jadi kalau kamu pakai alias, pastikan semua lapisan sinkron:
Module resolution adalah cara TypeScript mencari file saat membaca import.
Misalnya saat kamu menulis:
import { Button } from '@/components/button';TypeScript harus menentukan:
.ts, .tsx, .d.ts, .js, atau folderClassicModel lama. Jarang dipakai untuk project modern.
NodeMeniru perilaku resolusi modul Node.js tradisional.
NodeNextDipakai kalau project mengikuti semantics ESM Node modern dan ingin resolusi yang selaras dengan package type, extension, dan export map.
BundlerCocok untuk project yang dibundle oleh tool modern. TypeScript lebih fokus pada type-checking dan mengikuti pola bundler, bukan sepenuhnya meniru runtime Node.
NodeNext kalau output dan runtime benar-benar mengikuti Node ESM.Bundler kalau source akan diproses bundler modern dan kamu tidak ingin TypeScript terlalu memaksa aturan Node lama.module dan moduleResolution tidak cocok.exports map, tapi konfigurasi compiler belum mengikuti.Declaration file adalah file .d.ts yang berisi bentuk tipe, bukan implementasi JavaScript.
Isi declaration file biasanya mencakup:
Declaration file dipakai untuk memberi TypeScript pengetahuan tipe tentang sesuatu yang tidak memiliki source TypeScript yang langsung terlihat oleh compiler.
Contoh penggunaan:
window.__APP_CONFIG__.d.tsdeclare module 'legacy-date-lib' {
export function parseDate(value: string): Date;
export function formatDate(date: Date): string;
}Contoh global declaration:
export {};
declare global {
interface Window {
__APP_VERSION__: string;
}
}Ada dua pola umum:
Dibaca otomatis oleh TypeScript
include atau typeRoots.Dipasang bersama package
.d.ts.types atau typings di package.json..d.ts — ini tidak boleh.export {} di file yang hanya berisi augmentasi global, sehingga scope jadi kacau.Build target menentukan versi JavaScript dan library yang dianggap tersedia saat compile.
target: versi output JavaScript yang dihasilkan TypeScript.lib: kumpulan API bawaan yang dianggap ada saat mengetik code.Contoh:
target: ES2017 bisa tetap memakai Promise, tapi tidak otomatis berarti semua fitur DOM atau Web API tersedia.lib menentukan apakah TypeScript mengenali API seperti fetch, Map, Set, atau DOM.{
"compilerOptions": {
"target": "ES2020",
"lib": ["ES2020", "DOM", "DOM.Iterable"]
}
}{
"compilerOptions": {
"target": "ES2019",
"declaration": true,
"emitDeclarationOnly": false,
"module": "ESNext"
}
}{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext"
}
}Target yang lebih rendah berarti TypeScript bisa menurunkan sintaks modern ke bentuk lama. Ini berguna kalau environment produksi belum mendukung fitur terbaru.
Tapi konsekuensinya:
target terlalu tinggi untuk runtime produksi.lib tidak sesuai environment, lalu muncul error tipe pada API yang sebenarnya ada atau sebaliknya.ESNext tanpa memeriksa bundler, runtime, dan test environment.Secara sederhana, TypeScript berjalan lewat tiga tahap konsep:
.js, .d.ts, sourcemap, atau artefak lain.Diagram ini penting karena banyak bug TypeScript bukan bug tipe, melainkan mismatch di tahap resolve atau emit.
Untuk project yang makin besar, biasanya lebih sehat kalau kamu punya beberapa config:
tsconfig.json dasartsconfig.app.jsontsconfig.node.jsontsconfig.build.jsonPola ini membantu memisahkan kebutuhan editor, build, test, dan tooling.
Kalau TypeScript tahu @/, tapi Jest atau Node tidak, hasilnya akan membingungkan.
Cek konsistensi di:
tsconfig.jsonSemakin besar project, semakin mahal biaya menyalakan strict mode belakangan.
Mulai dari ketat sejak awal biasanya lebih murah daripada membersihkan hutang tipe di akhir.
tsconfig dipaksa melayani semua kebutuhan.moduleResolution dipilih tanpa memperhatikan runtime target.declaration aktif, tapi publik API belum dirapikan..d.ts dibuat untuk menutupi masalah integrasi, bukan untuk mendeskripsikan kontrak.compilerOptions: pusat perilaku compiler TypeScript.Kalau kamu sedang debug TypeScript, biasanya urutan cek yang paling cepat adalah: tsconfig → moduleResolution → paths → runtime resolver → declaration file → target output.