Menu

25 Pertanyaan Interview TypeScript dan Jawabannya + Kode

25 pertanyaan interview TypeScript dengan jawaban singkat yang benar beserta kode, dikelompokkan dari pemula sampai mahir: any vs unknown, interface vs type, generic, narrowing, utility type, mapped type dan conditional type, structural typing, tsconfig, dan TypeScript 7.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Berikut pertanyaan TypeScript yang paling sering ditanyakan pewawancara, dengan jawaban singkat yang sebaiknya bisa kamu berikan dan contoh kecilnya. Pertanyaannya dikelompokkan berdasarkan level; posisi junior biasanya berhenti setelah kelompok pertama, sedangkan posisi senior mengharapkanmu bisa menulis tipe di kelompok terakhir di luar kepala.

Pertanyaan Tingkat Pemula

1. Apa itu TypeScript?

TypeScript adalah JavaScript dengan tipe statis, buatan Microsoft. Kamu memberi anotasi tipe pada nilai, compiler memeriksanya, lalu menghapus tipe-tipe itu dan menghasilkan JavaScript biasa yang berjalan di mana pun JavaScript bisa berjalan.

Tanpa komentar @ts-expect-error, pemanggilan kedua adalah error kompilasi, jadi bug itu tidak akan pernah sampai ke production.

2. Apakah TypeScript memeriksa tipe saat runtime?

Tidak. Tipe dihapus saat kompilasi; output-nya sama sekali tidak menyisakan jejak tipe. Kode di atas mencetak 23 karena saat runtime tidak ada yang tahu bahwa a seharusnya angka. Untuk memeriksa data dari luar program (JSON, input pengguna, response API), kamu menulis pemeriksaan sungguhan, seperti type guard atau validator schema.

3. Apa saja tipe dasarnya?

string, number (satu tipe untuk bilangan bulat dan desimal; tidak ada int), boolean, bigint, symbol, null dan undefined, ditambah array (number[]), tuple ([string, number]), tipe object, any, unknown, never, dan void. Pakai nama dengan huruf kecil: String dan Number adalah tipe object pembungkus.

4. Apa perbedaan any dan unknown?

Keduanya menerima nilai apa pun. any juga mematikan pemeriksaan, jadi operasi apa pun lolos kompilasi. unknown tidak mengizinkan apa pun sampai kamu melakukan narrowing, sehingga ia menjadi tipe yang aman untuk nilai yang belum kamu periksa.

5. Apa itu inferensi tipe?

Compiler menentukan sendiri tipe yang tidak kamu tulis: let count = 0 adalah number, const mode = "dark" adalah tipe literal "dark", dan tipe kembalian fungsi diambil dari pernyataan return-nya. Aturan umumnya adalah memberi anotasi pada parameter fungsi dan tipe kembalian yang publik, lalu membiarkan inferensi menangani variabel lokal.

6. Apa perbedaan interface dan type?

Keduanya menjelaskan bentuk object, dan class bisa implements keduanya. interface bisa dibuka ulang dan digabung (declaration merging) dan bisa extends interface lain. Alias type bisa memberi nama pada apa saja: union, tuple, tipe primitif, mapped type, dan conditional type.

interface User { name: string }
interface User { age: number }       // merged: User has name and age

type Id = string | number;           // only a type alias can be a union
type Pair = [string, number];        // or a tuple
type Admin = User & { role: "admin" };

Konvensi yang umum adalah interface untuk bentuk object dan type untuk yang lainnya. Perbandingan lengkapnya ada di halaman interface vs type.

7. Apa itu union type dan intersection type?

Union A | B adalah nilai yang berupa salah satu dari tipe-tipe itu; kamu hanya bisa memakai member yang dimiliki semuanya sampai kamu melakukan narrowing. Intersection A & B adalah nilai yang sekaligus keduanya, dengan semua member dari masing-masing tipe.

type Id = string | number;                 // either
type Timestamped = { createdAt: Date };
type Post = { title: string } & Timestamped; // both: title and createdAt

8. Apa perbedaan void dan never?

void adalah tipe kembalian fungsi yang selesai secara normal tanpa nilai yang berguna. never adalah tipe dari sesuatu yang tidak mungkin terjadi: fungsi yang selalu melempar error atau berulang selamanya, atau union yang semua kasusnya sudah dibuang. never bisa di-assign ke setiap tipe, dan tidak ada nilai yang bisa di-assign ke never.

function log(msg: string): void { console.log(msg); }
function fail(msg: string): never { throw new Error(msg); }
type Impossible = string & number; // never

Pertanyaan Tingkat Menengah

9. Apa itu type narrowing?

Narrowing adalah compiler yang mengikuti pemeriksaanmu dan mempersempit tipe di dalam setiap cabang. Ia memahami typeof, instanceof, in, pemeriksaan kesamaan, truthiness, dan type guard buatan sendiri.

10. Apa itu user-defined type guard?

Fungsi yang tipe kembaliannya value is T. Kalau fungsi itu mengembalikan true, variabel milik pemanggil dipersempit menjadi T. Compiler memercayai fungsi tersebut, jadi body-nya harus benar-benar memeriksa nilainya.

interface Cat { meow(): void }

function isCat(value: unknown): value is Cat {
    return (
        typeof value === "object" &&
        value !== null &&
        "meow" in value &&
        typeof value.meow === "function"
    );
}

Assertion function, function assertCat(v: unknown): asserts v is Cat, melakukan narrowing dengan melempar error, bukan dengan mengembalikan false.

11. Apa itu generic?

Parameter tipe yang membuat satu fungsi, class, atau tipe bisa bekerja dengan banyak tipe sambil tetap menjaga hubungan antara input dan output. T disimpulkan dari argumen, dan extends membatasi tipe apa saja yang boleh dipakai.

pluck(users, "email") akan menjadi error kompilasi, karena "email" bukan keyof dari tipe user tersebut.

12. Apa fungsi keyof dan typeof di dalam tipe?

keyof T adalah union dari nama-nama properti T. Di posisi tipe, typeof x menghasilkan tipe sebuah variabel. Jika digabung, keyof typeof obj mengubah key sebuah object menjadi union.

const colors = { red: "#f00", green: "#0f0" };
type Colors = typeof colors;        // { red: string; green: string }
type ColorName = keyof typeof colors; // "red" | "green"

13. Apa itu utility type? Sebutkan beberapa.

Tipe generic bawaan yang mengubah tipe lain. Yang paling sering ditanyakan:

UtilityHasil
Partial<T>semua properti menjadi opsional
Required<T>semua properti menjadi wajib
Readonly<T>semua properti menjadi readonly
Pick<T, "a" | "b">hanya properti yang disebutkan
Omit<T, "a">semua properti kecuali yang disebutkan
Record<K, V>object dengan key K dan nilai V
Exclude<U, X>, Extract<U, X>membuang atau menyisakan member union
NonNullable<T>T tanpa null dan undefined
ReturnType<F>, Parameters<F>tipe kembalian atau tipe parameter sebuah fungsi
Awaited<T>nilai hasil resolve sebuah promise

Daftar lengkapnya ada di halaman utility type.

14. Apa itu discriminated union?

Union dari tipe-tipe object yang punya properti "tag" literal yang sama. Memeriksa tag-nya mempersempit nilai menjadi salah satu member, dan pemeriksaan never di cabang default membuat compiler melaporkan kasus apa pun yang terlupa.

15. Apa perbedaan as dan satisfies?

value as T adalah type assertion: ia menyuruh compiler memperlakukan nilai sebagai T dan melewati sebagian besar pemeriksaan. value satisfies T memeriksa nilai terhadap T tetapi tetap mempertahankan tipe milik nilai itu sendiri yang lebih presisi.

type Theme = { primary: string; secondary: string };

const a = { primary: "#07f" } as Theme;        // compiles: the missing key is not reported
const b = { primary: "#07f" } satisfies Theme; // error TS2741: Property 'secondary' is missing
const c = {} as { name: string };              // compiles; c.name is undefined at run time

Setelah object-nya lengkap, satisfies juga mempertahankan tipe hasil inferensinya sendiri: walaupun diperiksa terhadap Record<string, string>, variabelnya tetap tahu persis key apa saja yang dimilikinya, sedangkan anotasi akan melebarkannya menjadi key string apa pun.

16. Apa fungsi operator ! setelah variabel?

Itu adalah non-null assertion: el! membuang null dan undefined dari tipenya. Operator ini tidak menghasilkan pemeriksaan apa pun, jadi kalau nilainya ternyata null, program akan crash di tempat nilai itu dipakai. Lebih baik pakai ?., ??, atau if yang eksplisit.

17. Apa perbedaan private dan #private?

private hanya ditegakkan oleh compiler; di output JavaScript, propertinya adalah properti biasa. #field adalah private field JavaScript, yang ditegakkan oleh runtime.

protected bekerja seperti private, tetapi juga mengizinkan akses dari subclass, dan readonly melarang assign ulang setelah object dibuat.

18. Apa perbedaan abstract class dan interface?

Interface hanyalah tipe: ia menjelaskan bentuk dan hilang dari output. Abstract class adalah class sungguhan yang tidak bisa dibuat instance-nya; ia bisa berisi method yang sudah diimplementasikan, field, dan constructor, di samping member abstract yang wajib diimplementasikan oleh subclass. Sebuah class bisa meng-implement banyak interface, tetapi hanya bisa meng-extend satu class.

abstract class Repository<T> {
    protected items: T[] = [];
    abstract validate(item: T): boolean; // subclasses must implement
    add(item: T): void {                 // shared implementation
        if (this.validate(item)) this.items.push(item);
    }
}

19. Apa itu function overloading di TypeScript?

Beberapa call signature yang diikuti satu implementasi yang signature-nya kompatibel dengan semuanya. Pemanggil hanya melihat overload-nya, jadi setiap pemanggilan mendapat tipe kembalian yang tepat.

function parse(value: string): number;
function parse(value: string[]): number[];
function parse(value: string | string[]): number | number[] {
    return Array.isArray(value) ? value.map(Number) : Number(value);
}

const one = parse("4");          // number
const many = parse(["1", "2"]);  // number[]

Kalau tipe kembalian tidak bergantung pada tipe argumen, satu signature dengan parameter berupa union lebih sederhana.

Pertanyaan Tingkat Mahir

20. Apa itu structural typing?

TypeScript membandingkan tipe berdasarkan bentuknya, bukan namanya. Nilai apa pun yang punya properti yang diwajibkan akan diterima, walaupun tidak pernah dideklarasikan dengan tipe tersebut.

Properti tambahan color tidak masalah di sini karena pixel adalah variabel. Mengirim object literal secara langsung, show({ x: 3, y: 4, color: "red" }), menghasilkan error excess property, pemeriksaan yang hanya berlaku untuk literal yang baru ditulis. Kalau dua tipe dengan bentuk yang sama tidak boleh tercampur (UserId dan OrderId yang sama-sama string), pakai branded type: type UserId = string & { readonly __brand: "UserId" }.

21. Bagaimana kamu mengimplementasikan Readonly dan Partial sendiri?

Dengan mapped type: iterasi keyof T dan tambahkan modifier pada setiap properti.

type MyReadonly<T> = { readonly [K in keyof T]: T[K] };
type MyPartial<T> = { [K in keyof T]?: T[K] };
type Mutable<T> = { -readonly [K in keyof T]: T[K] }; // "-" removes a modifier

type User = { name: string; age: number };
type Draft = MyPartial<User>; // { name?: string; age?: number }

22. Apa itu conditional type dan infer?

T extends U ? X : Y memilih sebuah tipe berdasarkan kondisi. Di dalam kondisi itu, infer mendeklarasikan variabel tipe yang menangkap sebagian dari tipe yang cocok. Conditional type terdistribusi pada union.

type MyReturnType<F> = F extends (...args: any[]) => infer R ? R : never;
type ElementOf<T> = T extends (infer E)[] ? E : T;

type A = MyReturnType<() => Promise<number>>; // Promise<number>
type B = ElementOf<string[]>;                 // string
type C = ElementOf<number | boolean[]>;       // number | boolean (distributed)

Pola-pola lainnya ada di halaman conditional type.

23. Apa itu file .d.ts, dan apa fungsi declare?

Declaration file hanya berisi tipe untuk kode yang ada di tempat lain, seperti library JavaScript atau API browser. declare menyatakan bahwa sebuah nilai ada tanpa membuatnya: declare const VERSION: string; dikompilasi menjadi tidak ada apa-apa. Tipe library ikut dibundel dengan package-nya atau berasal dari package @types/{name}, dan tsc membuat file .d.ts untuk kodemu sendiri dengan declaration: true.

24. Apa fungsi strict, dan opsi tsconfig mana yang paling penting?

"strict": true mengaktifkan noImplicitAny, strictNullChecks, strictFunctionTypes, strictBindCallApply, strictPropertyInitialization, noImplicitThis, useUnknownInCatchVariables, dan strictBuiltinIteratorReturn. Di TypeScript 7, opsi ini aktif secara default. Opsi lain yang sering ditanyakan pewawancara:

OpsiJawaban dalam satu baris
targetversi JavaScript yang dipakai output
moduleformat module output: nodenext mengikuti aturan Node, esnext/preserve mempertahankan import untuk bundler
moduleResolutioncara import ditemukan: nodenext meminta ./file.js di file ES module, bundler menerima ./file
noUncheckedIndexedAccessarr[i] menyertakan undefined di tipenya
pathsalias import khusus untuk type checker; output tetap menyimpan alias-nya, jadi bundler atau field imports milik Node harus me-resolve-nya
skipLibCheckmelewati pemeriksaan file .d.ts, demi kecepatan
verbatimModuleSyntaximport yang hanya dipakai sebagai tipe harus ditandai type; import lain dipertahankan seperti yang ditulis

25. Apa itu TypeScript 7?

Compiler TypeScript yang ditulis ulang dengan Go sebagai program native, dirilis sebagai versi 7 dari package npm typescript. Perintahnya tetap tsc dan bahasanya sama, tetapi jauh lebih cepat daripada compiler 6.x yang berbasis JavaScript: tim TypeScript melaporkan percepatan 8x sampai 12x pada full build pada umumnya, berkat kode native dan multithreading dengan shared memory. Versi ini juga menegakkan penghapusan fitur yang sudah ditandai usang di 6.0; misalnya baseUrl, outFile, moduleResolution: "node10", module: "amd", dan alwaysStrict: false sekarang menjadi error (TS5102, TS5108) yang menyuruhmu menghapusnya.

Pertanyaan yang sering diajukan

Apa saja pertanyaan interview TypeScript yang paling umum?

Yang paling sering muncul: perbedaan any dan unknown, interface vs type, cara kerja generic, cara kerja narrowing dan type guard, fungsi utility type seperti Partial, Pick, dan Omit, serta apakah TypeScript memeriksa tipe saat runtime (jawabannya tidak).

Pertanyaan TypeScript apa yang ditanyakan untuk developer senior?

Bersiaplah untuk menulis tipe, bukan hanya membacanya: implementasikan Readonly atau ReturnType dengan mapped type dan conditional type, jelaskan structural typing dan kapan memakai branded type, rancang discriminated union dengan pemeriksaan exhaustive, dan diskusikan pilihan tsconfig seperti strict, noUncheckedIndexedAccess, dan module resolution.

Bagaimana cara mempersiapkan interview TypeScript?

Tulis program-program kecil dengan strict aktif dan baca error compiler-nya sampai kamu bisa menebaknya. Pastikan kamu bisa menjelaskan narrowing, generic dengan constraint, utility type utama, dan kenapa type assertion tidak aman, masing-masing dengan contoh dua baris.

Apakah TypeScript ditanyakan di interview React dan Angular?

Biasanya iya. Angular sendiri ditulis dengan TypeScript dan aplikasi Angular juga ditulis dengannya, jadi interview Angular cenderung menganggapmu sudah menguasainya, termasuk decorator seperti @Component dan access modifier. Interview React untuk codebase TypeScript sering memintamu memberi tipe pada props, state, dan event handler, yang memakai interface, union, dan generic yang sama seperti di halaman ini.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai