CodeBlanks Logo Icon CodeBlanks

keyof kısıtı

keyof ile özellik adı kısıtı öğrenirsin.

keyof kısıtı

keyof T, T türünün tüm özellik adlarını birleşim türü olarak verir. K extends keyof T yazarak K'nın yalnızca T'nin geçerli bir özellik adı olmasını sağlarsın. Böylece al(obje, "ad") çağrısı güvenli olur; var olmayan bir özellik adı derleme hatasıdır.

function al<T, K extends keyof T>(o: T, k: K): T[K] {
  return o[k];
}
const u = { ad: "Ayşe", yas: 30 };
console.log(al(u, "ad"));  // Ayşe

T[K] dizin türü

T[K], T'nin K özelliğinin değer türünü verir. al<T, K extends keyof T>(o: T, k: K): T[K] imzası, döndürülen değerin tam olarak o özelliğin türü olmasını sağlar. Böylece al(u, "yas") çağrısı number dönerken al(u, "ad") çağrısı string döner; her ikisi de derleme zamanında bilinir.

Uygulama Özellik getir

al<T, K extends keyof T>(o: T, k: K): T[K] generic fonksiyonunu yaz; gövdesi return o[k]; olsun. { ad: "Ece", yas: 25 } nesnesini kisi değişkenine ata. al(kisi, "ad") ve al(kisi, "yas") sonuçlarını ayrı satırlarda yazdır.

Başlangıç kodu

index.ts
// al fonksiyonunu iki tür parametreli generic olarak yaz
// K parametresini T'nin özellik adlarıyla sınırla
// dönüş türü T'nin K özelliği olsun
// gövde return o[k]; olsun
// kisi değişkenine { ad: "Ece", yas: 25 } ata
// kisi'den "ad" ve "yas" özelliklerini ayrı satırlarda yazdır

Örnek çözüm

index.ts
function al<T, K extends keyof T>(o: T, k: K): T[K] {
  return o[k];
}
const kisi = { ad: "Ece", yas: 25 };
console.log(al(kisi, "ad"));
console.log(al(kisi, "yas"));

Beklenen çıktı

Ece
25

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 K extends keyof T kısıtı neyi garanti eder?

index.ts
function al<T, K extends keyof T>(o: T, k: K): T[K]
  • K'nın number olduğunu
  • T'nin bir dizi olduğunu
  • T'nin K özelliğe sahip olduğunu
  • K'nın T'nin geçerli bir özellik adı olduğunu Doğru cevap

Açıklama: keyof T, T'nin tüm özellik adlarını verir; K extends keyof T ise K'nın bu adlardan biri olduğunu garanti eder. T'nin yapısıyla değil K'nın adıyla ilgilidir.

2 keyof ile K'yı sınırla

Soru
function al<T, K extends ____>(o: T, k: K): T[K] {
  return o[k];
}
Cevap
function al<T, K extends keyof T>(o: T, k: K): T[K] {
  return o[k];
}

Açıklama: K'nın T'nin özellik adlarından biri olması için keyof T kullanılır. Yalnızca T herhangi bir sınır koymaz; string tüm string'leri kabul eder; keyof K ters yön mantıksızdır.

3 keyof kısıtı parçaları

Kavram Anlamı
keyof T T'nin özellik adları birleşimi
K extends keyof T K'yı özellik adıyla sınırlar
T[K] K özelliğinin değer türü
al(u, "ad") Geçerli özellik adıyla çağrı

Orta seviye bölümündeki tüm dersler