CodeBlanks Logo Icon CodeBlanks

Conditional ile mantık

Koşullu türlerle tür seviyesinde mantık kurmayı öğrenirsin.

Conditional ile mantık

Koşullu türlerle tür seviyesinde mantık kurabilirsin. T extends U ? never : T deseni, T'nin U'ya atanabilen üyelerini birleşimden çıkarır; bu Exclude'ün temelidir. Tersine T extends U ? T : never, yalnızca U'ya atanabilenleri tutar; bu Extract'in temelidir.

type Cikar<T, U> =
  T extends U ? never : T;
type R = Cikar<"a" | "b", "b">;
// "a"

never birleşimden kaybolur

Dağıtıcı koşullu türlerle never birleşimde kaybolur. "a" | never | "c" = "a" | "c". Bu sayede filtreleme mantığı doğal olarak çalışır: koşulu sağlamayanlar never olur ve sonuçtan düşer.

Uygulama Birleşimden çıkar

Cikar<T, U> koşullu türünü yaz: T extends U ? never : T. Kalan türünü Cikar<"a" | "b" | "c", "b"> olarak tanımla. dizi değişkenini Kalan[] türünde tanımla ve ["a", "c"] ata. dizi[0] ve dizi[1]'i ayrı satırlarda yazdır.

Başlangıç kodu

index.ts
// Cikar<T, U> koşullu türünü tanımla
// T, U'ya atanabilirsa never, değilse T
// Kalan türünü Cikar<"a" | "b" | "c", "b"> olarak tanımla
// dizi değişkenini Kalan[] türünde tanımla, ["a", "c"] ata
// dizi[0] ve dizi[1]'i ayrı satırlarda yazdır

Örnek çözüm

index.ts
type Cikar<T, U> = T extends U ? never : T;
type Kalan = Cikar<"a" | "b" | "c", "b">;
const dizi: Kalan[] = ["a", "c"];
console.log(dizi[0]);
console.log(dizi[1]);

Beklenen çıktı

a
c

Soru ve cevaplar

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

1 Cikar<"a" | "b" | "c", "b"> ne üretir?

index.ts
type Cikar<T, U> = T extends U ? never : T;
type R = Cikar<"a" | "b" | "c", "b">;
  • "b"
  • "a" | "c" Doğru cevap
  • "a" | "b" | "c"
  • never

Açıklama: Dağıtım her üyeyi ayrı değerlendirir: "a" ve "c" U'ya atanamadığından kalır, "b" atanabildiğinden never olur ve birleşimden düşer. Sonuç "a" | "c".

2 Filtre için never kullan

Soru
type Cikar<T, U> =
  T extends U ? ____ : T;
type R = Cikar<"a" | "b", "b">;
// R: "a"
Cevap
type Cikar<T, U> =
  T extends U ? never : T;
type R = Cikar<"a" | "b", "b">;
// R: "a"

Açıklama: U'ya atanabilen üyeleri çıkarmak için never kullanılır. any veya unknown filtreyi bozar; T ise hiçbir şeyi çıkarmaz.

3 Mantık desenleri

Kavram Anlamı
T extends U ? never : T U'ya atanabilenleri çıkarır
T extends U ? T : never U'ya atanabilenleri tutar
never Birleşimden kaybolur
"a" | never | "c" "a" | "c"'ye eşittir

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