- Konu sahibi
- #1
Nesne yapısını tanımlarken genellikle
Bu varsayımsal örneği TypeScript yüklü bir ortamda
Atama geçerlidir çünkü TypeScript burada adlara değil, türlerin yapısına bakar:
İki seçeneğin nesne tanımlamada örtüşmesi, her türü aynı biçimde ifade edebildikleri anlamına gelmez:
Birleşim türü, bir değerin birden fazla türden biri olabileceğini belirtir. Örneğin bir kimliğin sayı veya metin olmasını
Yeni bir nesne türü oluştururken bir interface başka bir uygun nesne türünü
Buna karşılık bildirim birleştirme, aynı kapsamda aynı adlı bir interface için yapılan uyumlu bildirimlerin tek tanım olarak ele alınmasıdır:
Bu örnekte
Kesişimlerde çakışmaya dikkat edin:
Nesne modellerinde
Her iki yapı da tür denetimi içindir ve JavaScript çıktısında çalışma zamanı doğrulaması sağlamaz. API veya kullanıcı girdisi gibi güvenilmeyen veriler için, alanların varlığını ve beklenen türlerini ayrıca çalışma anında doğrulayın.
interface ile başlayabilirsiniz; birleşim türü, tuple veya bir tür işleminin sonucu için type kullanın. Her ikisi de nesne türlerini tanımlayabilir ve çoğu basit durumda birbirinin yerine geçer. Seçimi asıl değiştiren noktalar, tanımın sonradan birleştirilmesi ve ihtiyaç duyulan türün yapısıdır.Aynı nesneyi iki yolla tanımlamak
interface, bir nesnenin sahip olması gereken üyeleri tanımlamak için kullanılır. type ise bir türe ad veren takma addır; bu tür bir nesne de olabilir. Örneğin aşağıdaki iki tanım, ad alanı metin olan bir nesneyi tarif eder:
Kod:
interface Kullanici {
ad: string;
}
type Profil = {
ad: string;
};
const kullanici: Kullanici = { ad: "Deniz" };
const profil: Profil = kullanici;
console.log(profil.ad);
Bu varsayımsal örneği TypeScript yüklü bir ortamda
ornek.ts olarak kaydedin. tsc ornek.ts --strict ile derleyip oluşan JavaScript dosyasını Node.js ile node ornek.js komutuyla çalıştırdığınızda çıktı Deniz olur.Atama geçerlidir çünkü TypeScript burada adlara değil, türlerin yapısına bakar:
Kullanici, Profil için gereken ad: string alanına sahiptir. Örnekte ad değerini sayı yaparsanız tür denetimi hata verir. Bu kontrol, dışarıdan gelen bir verinin çalışma anında gerçekten doğru olduğunu kanıtlamaz.Seçimi değiştiren farklar
İki seçeneğin nesne tanımlamada örtüşmesi, her türü aynı biçimde ifade edebildikleri anlamına gelmez:
| İhtiyaç | interface | type |
|---|---|---|
| Nesne yapısını adlandırma | Evet | Evet |
| Birleşim veya tuple türüne ad verme | Doğrudan değil | Evet |
| Aynı kapsamda bildirimi yeniden açıp birleştirme | Uyumlu bildirimlerde evet | Hayır |
| Mevcut türden yeni bir tür oluşturma | extends ile | & ile kesişim dahil tür işlemleriyle |
type Kimlik = number | string; ile ifade edebilirsiniz. interface ile bu birleşime doğrudan ad veremezsiniz. Benzer şekilde type Koordinat = [number, number];, iki sayıdan oluşan bir tuple türünü adlandırır.Genişletme ve bildirim birleştirme aynı şey değildir
Yeni bir nesne türü oluştururken bir interface başka bir uygun nesne türünü
extends ile genişletebilir. Bir type takma adı da & kesişim işleciyle türleri birleştirebilir. Her iki yol da mevcut tanımı değiştirmek yerine yeni bir tür oluşturur:
Kod:
interface Kisi {
ad: string;
}
interface Calisan extends Kisi {
departman: string;
}
type Yonetici = Kisi & {
ekipBuyuklugu: number;
};
Buna karşılık bildirim birleştirme, aynı kapsamda aynı adlı bir interface için yapılan uyumlu bildirimlerin tek tanım olarak ele alınmasıdır:
Kod:
interface Ayarlar {
tema: string;
}
interface Ayarlar {
dil: string;
}
const ayarlar: Ayarlar = { tema: "koyu", dil: "tr" };
Bu örnekte
Ayarlar iki alanı da gerektirir. Aynı kapsamda aynı adlı iki type bildirimi ise birleştirilmez; yinelenen ad hatası oluşur. Interface bildirimlerinde de aynı adlı özelliklerin uyumsuz türlerle tanımlanması hatadır.Kesişimlerde çakışmaya dikkat edin:
type Sonuc = { id: string } & { id: number }; ifadesi, id için iki koşulun aynı anda karşılanmasını ister. Bu durumda özellik türü never olur; normal bir metin veya sayı bu koşulu karşılamaz. Böyle bir sonuç görürseniz birleştirdiğiniz tanımlardaki ortak alanları düzeltin.Projenizde hangisini seçmelisiniz?
Nesne modellerinde
interface kullanmak ve birleşim, tuple veya diğer tür işlemlerinde type seçmek uygulanabilir bir başlangıç kuralıdır. Kütüphane tüketicilerinin uyumlu bildirimlerle genişletmesi amaçlanan bir nesne sözleşmesinde interface’in birleştirilebilmesi özellikle yararlıdır. Böyle bir gereksinim yoksa basit nesneler için type kullanmak da geçerlidir; mevcut projenin tutarlı tercihine uyabilirsiniz.Her iki yapı da tür denetimi içindir ve JavaScript çıktısında çalışma zamanı doğrulaması sağlamaz. API veya kullanıcı girdisi gibi güvenilmeyen veriler için, alanların varlığını ve beklenen türlerini ayrıca çalışma anında doğrulayın.