Learn
← Previous Next →

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