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:
let result: number | string;
result = 42; // Valid
result = 'Error 404'; // ValidAncak 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:
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:
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.
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
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.
İ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
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.
İ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
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.
İ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
İ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).
İ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