Tür Korumaları: in & instanceof
Coddy'nin JavaScript Journey'sinin TypeScript'e Giriş bölümünün bir parçası — ders 69 / 73.
Birleşim türleri (union types) ile çalışırken, türe özgü özelliklere veya metotlara güvenli bir şekilde erişmeden önce genellikle hangi özel türle uğraştığınızı belirlemeniz gerekir. Tür korumaları (type guards), çalışma zamanında türleri daraltmak için güvenli bir yol sağlar.
in operatörü, bir özelliğin bir nesne üzerinde var olup olmadığını kontrol eder. Bu, özellikle farklı özelliklere sahip nesne türlerinin bir birleşimine (union) sahip olduğunuzda kullanışlıdır:
type Dog = { name: string; breed: string };
type Cat = { name: string; meow: () => void };
function petSound(pet: Dog | Cat) {
if ('breed' in pet) {
// TypeScript burada pet'in bir Dog olduğunu bilir
console.log(`${pet.name} is a ${pet.breed}`);
} else {
// TypeScript burada pet'in bir Cat olduğunu bilir
pet.meow();
}
}instanceof operatörü, bir nesnenin belirli bir yapıcı (constructor) fonksiyon veya sınıf tarafından oluşturulup oluşturulmadığını kontrol eder. Henüz sınıfları işlememiş olsak da, bu operatör yerleşik JavaScript nesneleri veya özel sınıflarla çalışırken kullanışlıdır:
function processValue(value: string | Date) {
if (value instanceof Date) {
// TypeScript, value'nun bir Date olduğunu bilir
console.log(value.getFullYear());
} else {
// TypeScript, value'nun bir string olduğunu bilir
console.log(value.toUpperCase());
}
}Her iki operatör de TypeScript derleyicisinin hangi tiple çalıştığınızı anlamasına yardımcı olarak, tipe özgü özelliklere ve metotlara güvenli erişim sağlar.
Görev
KolayAralarındaki farkı ayırt etmek için in operatörünü kullanarak farklı medya öğesi türlerini işleyen bir fonksiyon oluşturun.
İki tür takma adı (type alias) oluşturun:
Movie:title(string) vedirector(string) özelliklerine sahipSong:title(string) veartist(string) özelliklerine sahip
Aşağıdakileri yapan getMediaInfo adında bir fonksiyon oluşturun:
Movie | Songtüründe birmediaparametresi alırdirectorözelliğinin var olup olmadığını kontrol etmek içininoperatörünü kullanır- Eğer bir filmse
"Movie: [title] directed by [director]"döndürür - Eğer bir şarkıysa
"Song: [title] by [artist]"döndürür - Açık bir
stringdönüş türüne sahiptir
Aşağıdakileri yapan processValue adında ikinci bir fonksiyon oluşturun:
string | Datetüründe birvalueparametresi alırvaluedeğerinin birDateolup olmadığını kontrol etmek içininstanceofoperatörünü kullanır- Eğer bir Date ise yılı sayı olarak döndürür (
getFullYear()kullanarak) - Eğer bir string ise string uzunluğunu sayı olarak döndürür
- Açık bir
numberdönüş türüne sahiptir
Test verilerini oluşturun:
movie1:{ title: "Inception", director: "Christopher Nolan" }song1:{ title: "Bohemian Rhapsody", artist: "Queen" }movie2:{ title: "The Matrix", director: "The Wachowskis" }song2:{ title: "Imagine", artist: "John Lennon" }testDate:new Date("2023-12-25")testString:"TypeScript"
Aşağıdaki çıktıları yazdırın:
movie1ilegetMediaInfofonksiyonunu çağırınsong1ilegetMediaInfofonksiyonunu çağırınmovie2ilegetMediaInfofonksiyonunu çağırınsong2ilegetMediaInfofonksiyonunu çağırıntestDateileprocessValuefonksiyonunu çağırıntestStringileprocessValuefonksiyonunu çağırın
Kendin dene
// YAPILACAK: Kodunuzu buraya yazın
// Movie ve Song için tür takma adları oluşturun
// getMediaInfo fonksiyonunu oluşturun
// processValue fonksiyonunu oluşturun
// Test verilerini oluşturun
const movie1 = { title: "Inception", director: "Christopher Nolan" };
const song1 = { title: "Bohemian Rhapsody", artist: "Queen" };
const movie2 = { title: "The Matrix", director: "The Wachowskis" };
const song2 = { title: "Imagine", artist: "John Lennon" };
const testDate = new Date("2023-12-25");
const testString = "TypeScript";
// Çıktıları yazdırın
console.log(getMediaInfo(movie1));
console.log(getMediaInfo(song1));
console.log(getMediaInfo(movie2));
console.log(getMediaInfo(song2));
console.log(processValue(testDate));
console.log(processValue(testString));Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
TypeScript'e Giriş bölümündeki tüm dersler
1TS ile Başlarken
TypeScript Nedir?Neden TypeScript Kullanılır?İlk TypeScript KodunuzDerleme Süreci ve HatalarÖzet: TS'ye Giriş4Fonksiyonlarla Çalışmak
Parametre ve Dönüş Değerlerini TiplendirmeArrow Fonksiyonlarını Tiplendirme'void' Dönüş Tipi'?' ile Opsiyonel ParametrelerVarsayılan Parametre DeğerleriRest Parametrelerini TiplendirmeFonksiyon Tiplerini TanımlamaÖzet: Tiplendirilmiş Fonksiyonlar Oluşturma2Temel Tipler
Temel Tipler: str, num, boolean'any' Tipi: Kaçış Yolu'unknown' Tipi'null' ve 'undef' ile ÇalışmakTip Çıkarımı İş BaşındaAçık Tip BelirlemeleriÖzet: Temel Tipler Pratiği5Tipler: Takma Adlar, Unionlar ve Kesişimler
İlkel Tipler için Tip Takma AdlarıUnion Tipler ('|')Union Tipler ile ÇalışmakLiteral TiplerKesişim Tipleri ('&')Tip Takma Adlarını BirleştirmeÖzet: Gelişmiş Tip Kombinasyonları8Enumlar
Sayısal Enum Nedir?Sayısal Enum KullanımıString Enum Nedir?String Enum KullanımıHeterojen EnumlarÖzet: Enum Kullanımı11İleri Düzey Konular
Tür AtamalarıTür Korumaları: in & instanceof'never' TürüNullable Türler ('strictNull')Nesneler için İndeks İmzalarıÖzet: Türlerde İnce Ayar Yapma3Veri Yapısı: Diziler ve Tuple
Tipli DizilerDiziler için 'readonly' BelirleyicisiTuple Nedir?Tuple Tanımlama ve ErişmeTuple DestructuringReadonly Tuple'larÇok Boyutlu Tipli DizilerDizilerle Spread OperatörüÖzet: Diziler ve Tuple'lar6Nesneleri ve Interface'leri Tiplendirme
Satır İçi Nesne Tipi BelirtimleriNesneler için Type Alias KullanımıInterface'lere GirişInterface'ler ve Type Alias'ların KarşılaştırılmasıOpsiyonel ve Readonly ÖzelliklerInterface ve Tipleri GenişletmeInterface'lere Metot EklemeÖzet: Nesne Yapılarını Tanımlama