Learn
← Previous Next →

Hari 14: Template Literal Types & Infer

60 min Last updated 09 Apr 2026

Template Literal Types (TS 4.1+)

type EventName = "click" | "hover" | "focus";
type Handler = `on${Capitalize}`;
// "onClick" | "onHover" | "onFocus"

type CRUD = "create" | "read" | "update" | "delete";
type Model = "user" | "post" | "comment";
type APIEndpoint = `/${Model}/${string}`;
// "/user/...", "/post/...", "/comment/..."

// CSS unit type
type CSSUnit = "px" | "em" | "rem" | "%" | "vh" | "vw";
type CSSValue = `${number}${CSSUnit}`;
// "16px", "1.5rem", "100%", etc.

infer — Ekstrak Tipe dari Struktur

// Ekstrak return type
type GetReturnType any>
    = T extends (...args: any) => infer R ? R : never;

// Ekstrak tipe Promise
type Awaited2 = T extends Promise ? V : T;

// Ekstrak parameter pertama
type FirstArg any>
    = T extends (first: infer F, ...rest: any) => any ? F : never;

function greet(name: string, age: number): string {
    return `${name} (${age})`;
}
type GreetReturn = GetReturnType; // string
type GreetFirst = FirstArg;       // string

💡 Notice: Type-safe event system memastikan handler menerima data dengan tipe yang tepat sesuai event-nya. Ini adalah pattern umum di React, Svelte, dll.

Assignment

Buat type-safe event system menggunakan template literal types. EventMap = {click: MouseEvent, keydown: KeyboardEvent, ...}. Buat fungsi addEventListener yang type-safe.

Expected output:

Loaded 2 items (total: 2)
Login: Budi (ID: 1)
TS index.ts
Solution
Output