Ana içeriğe geç
Modül 2 · Ders 2 ders 2Kurstaki 4/14~15 min
Modül dersleri (2/2)

Birleşmeler ve Daralma

Gerçek dünyada değişkenler ve API yanıtları her zaman tek bir sabit türe sahip değildir. TypeScript, değişkenliği yönetmek için Birleşim Türleri ve çalışma zamanında bunlar üzerinde güvenli bir şekilde çalışmak için Tür Daraltma sunar.


Rakor Çeşitleri

Birleşim türü, bir değişkenin farklı türdeki değerleri kabul etmesine olanak tanır. Dikey çubuk (|) sembolü kullanılarak ifade edilir:

TS
let result: number | string;
result = 42; // Valid
result = 'Error 404'; // Valid

Ancak bir birleşim türüyle çalışırken yalnızca türlerden birine ait olan yöntemleri doğrudan çağıramayız (örneğin, değişken aynı zamanda bir number olabiliyorsa .toUpperCase() öğesini çağıramayız). İlk önce türü "daraltmalıyız".


Tip Daraltma

Tür Daraltma, çalışma zamanında bir değişken için daha spesifik bir tür belirlemek amacıyla TypeScript'in kontrol akışı yapılarını (if veya switch gibi) analiz ettiği süreçtir.

Daraltma gerçekleştirmenin birkaç yolu vardır:

1. typeof Operatörü

İlkel türleri ayırt etmek için idealdir:

TS
function printLength(value: string | number) {
  if (typeof value === 'string') {
    // TypeScript knows 'value' is a string here
    console.log(value.length);
  } else {
    // TypeScript knows 'value' is a number here
    console.log(value.toFixed(2));
  }
}

2. in Operatörü

Bir nesnede belirli bir özelliğin mevcut olup olmadığını kontrol etmek için kullanılır:

TS
interface Fish {
  swim: () => void;
}
interface Bird {
  fly: () => void;
}

function move(animal: Fish | Bird) {
  if ('swim' in animal) {
    animal.swim(); // Narrowing to Fish
  } else {
    animal.fly(); // Narrowing to Bird
  }
}

Ayrımcılığa Uğrayan Sendikalar

Ayrımlı Birleşimler modeli, benzersiz bir gerçek değere (discriminator adı verilir) sahip ortak bir özelliği paylaşan nesnelerin oluşturulmasından oluşur. TypeScript bu ayırıcıyı tanır ve türü koşullu bloklar içinde otomatik olarak daraltır.

TS
interface SuccessResponse {
  status: 'success'; // Literal discriminator
  data: string;
}

interface ErrorResponse {
  status: 'error'; // Literal discriminator
  errorMessage: string;
}

type ApiResponse = SuccessResponse | ErrorResponse;

function handleResponse(response: ApiResponse) {
  if (response.status === 'success') {
    console.log('Data received:', response.data);
  } else {
    console.error('An error occurred:', response.errorMessage);
  }
}

Kendin dene

Alıştırma 1: Birleşim Türleri

Egzersiz#ts.m2.l2.e1
Denemeler: 0Yükleniyor…

Sayı veya dize olabilen id adında bir değişken bildirin. İlk önce 101 numarasıyla başlatın, ardından 'USER-101' dize değerini atayın.

Düzenleyici yükleniyor…
İpucu göster

| izin değişkeni bildiriminde sayı ve dizeyi birleştirmek için operatör.

3 denemeden sonra çözüm mevcut

Alıştırma 2: Temel Tip Daraltma

Egzersiz#ts.m2.l2.e2
Denemeler: 0Yükleniyor…

String veya number türünde bir parametre girişini kabul eden formatInput adlı bir işlev oluşturun. Giriş bir dize ise, girişi büyük harfe dönüştürülmüş olarak döndürür. Bir sayıysa, girdiyi 2 ile çarparak döndürün. Türleri açıkça belirtin.

Düzenleyici yükleniyor…
İpucu göster

Davranışı dallara ayırmak için bir if bloğunun içinde typeof input === 'string' kullanın.

3 denemeden sonra çözüm mevcut

Alıştırma 3: 'içeri' ile daraltma

Egzersiz#ts.m2.l2.e3
Denemeler: 0Yükleniyor…

Car (drive yöntemiyle) ve Boat (yelken yöntemiyle) adlı iki arayüz göz önüne alındığında, Car veya Boat tipinde bir parametre aracını kabul eden moveVehicle adında bir fonksiyon yazın. Araçta Drive özelliği varsa, Drive() yöntemini yürütün. Aksi takdirde sail() yöntemini yürütün.

Düzenleyici yükleniyor…
İpucu göster

Arayüzü daraltmak için araçtaki 'drive' formundaki in operatörünü kullanın.

3 denemeden sonra çözüm mevcut

Alıştırma 4: Ayrımcı Birleşim Şekli

Egzersiz#ts.m2.l2.e4
Denemeler: 0Yükleniyor…

İki türün birleşimi olan bir Şekil türü tanımlayın: Daire ve Kare. Circle'ın 'circle' (gerçek değer) ve yarıçap (sayı) olarak ayarlanmış bir tür özelliği vardır. Karenin 'kare' (gerçek değer) ve bir kenar (sayı) olarak ayarlanmış bir tür özelliği vardır. Daha sonra Shape tipindeki şekli kabul eden ve alanı sayı olarak döndüren getArea fonksiyonunu yazın (daire Math.PI * yarıçap * yarıçap, kare kenar * kenar için).

Düzenleyici yükleniyor…
İpucu göster

Türü ayırt etmek ve doğru alanı hesaplamak için getArea içindeki Shape.kind === 'circle' komutunu kullanın.

3 denemeden sonra çözüm mevcut