TypeScript: Generics, Mapped Types, Conditional Types & "infer"
Kod yazarken değil, derleme aşamasında tip üreten metaprogramlama sihirbazlığı.
Kurabiye kalıbıdır. Kalıba ne tür hamur dökerseniz (Genel Tip T), fırından o şekilde kurabiye çıkar.
Generics tip bağımsız kod yazmayı sağlar. Mapped Types (Record, Partial, Pick) mevcut tipleri döngüyle dönüştürür. Conditional Types (T extends U ? X : Y) tip seviyesinde if-else mantığı kurar. "infer" anahtar kelimesi ise koşul içinde bilinmeyen bir tipi yakalar.
“TypeScript tip sistemi Turing-complete'tir. "infer" kelimesi, bir generic tipin içindeki dönen tipi (ReturnType) veya dizi elemanının tipini dinamik olarak çıkartmak (unwrapping) için Conditional Types ile birlikte kullanılır.”
// Fonksiyonun dönüş tipini çıkaran 'ReturnType' nasıl yazılır:
type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
function fetchUser() { return { id: 1, name: 'Ali' }; }
type User = MyReturnType<typeof fetchUser>; // { id: number, name: string }
Tembellik edip her yere "any" basmak ve TypeScript'in tip güvenliği avantajını tamamen çöpe atmak ("anyScript").