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