Hari 10: Mapped Types & Conditional Types
70 min
Last updated 09 Apr 2026
Mapped Types
// Buat tipe baru dengan transformasi setiap property
type Stringify = {
[K in keyof T]: string;
};
type User = { id: number; nama: string; aktif: boolean };
type StringUser = Stringify;
// { id: string; nama: string; aktif: string }
// Readonly mapped type
type DeepReadonly = {
readonly [K in keyof T]: T[K] extends object ? DeepReadonly : T[K];
};
// Optional mapped type
type Nullable = {
[K in keyof T]: T[K] | null;
};
Conditional Types
// T extends U ? X : Y
type IsString = T extends string ? "yes" : "no";
type A = IsString; // "yes"
type B = IsString; // "no"
// infer — ekstrak tipe dari tipe lain
type ReturnType = T extends (...args: any[]) => infer R ? R : never;
type ElementType = T extends (infer E)[] ? E : never;
function tambah(a: number, b: number): number { return a + b; }
type HasilTambah = ReturnType; // number
const arr = [1, 2, 3];
type ElemArr = ElementType; // number
💡
Notice: Mapped type dengan as clause (TS 4.1+) bisa mengubah nama key. Capitalize<string & K> mengkapitalisasi nama property.
Assignment
Buat mapped type Getters<T> yang mengubah setiap properti T menjadi getter function () => T[K]. Buat Setters<T> yang mengubah menjadi setter (val: T[K]) => void.
Expected output:
10
20
TS
index.ts
Solution
Output