Bir TypeScript nesne tipi, bir nesnenin sahip olduğu özellikleri ve her birinin tipini listeler: { name: string; age: number }. Bir özelliği opsiyonel yapmak için ?, yeniden atanmasını engellemek için readonly ekleyin. Tipi satır içi yazın ya da yeniden kullanmak için type veya interface ile ad verin.
Nesne Tiplerini Yazmak
Özellikler ; veya , ile ayrılır (ikisi de çalışır, alışılmış stil ;) ve tek başına bir satır sonu da yeterlidir. Tek seferlik bir parametre için satır içi tip yeterlidir; iki kez kullanılan her şeye bir ad verin.
// Inline, in a parameter
function area(rect: { width: number; height: number }): number {
return rect.width * rect.height;
}
// Named with a type alias
type Rect = { width: number; height: number };
// Named with an interface (the same shape)
interface RectShape {
width: number;
height: number;
}
type ve interface nesne biçimlerini eşit derecede iyi tanımlar. Farklar (declaration merging, union'lar) interface vs type sayfasında anlatılıyor.
Tipin bildirmediği bir özelliğe erişmek derleme hatasıdır: point.z TS2339 verir, Property 'z' does not exist on type '{ x: number; y: number; }'.
Opsiyonel Özellikler
Addan sonraki bir ?, özelliğin atlanabilmesini sağlar. Opsiyonel bir özelliği okumak T | undefined verir; bu yüzden TypeScript onu kullanmadan önce eksik durumu ele almanızı ister.
Opsiyonel bir özellik üzerinde kontrol etmeden bir metot çağırmak hatadır: p.nickname.toUpperCase() TS18048 ile başarısız olur, 'p.nickname' is possibly 'undefined'. Sonuç olarak undefined kabul edilebiliyorsa optional chaining (p.nickname?.toUpperCase()) kullanın.
prop?: T ve prop: T | undefined aynı şey değildir. İlki anahtarın olmamasına izin verir; ikincisi anahtarı zorunlu kılar, değeri undefined olabilse de:
Readonly Özellikler
readonly, nesne oluşturulduktan sonra bir özelliğin yeniden atanmasını engeller. Yalnızca derleme zamanında yapılan bir kontroldür ve sığdır (shallow): readonly bir özellikte saklanan bir nesne veya dizi içeriden yine değiştirilebilir.
Çıktı iki sınırı da gösteriyor: id çalışma zamanında gerçekten değişti (readonly olduğunu yalnızca derleyici biliyordu) ve içerideki dizi değiştirildi. Readonly bir dizi için readonly string[] kullanın; her özelliği birden readonly yapmak için Readonly<Order> kullanın.
Fazla Özellik Kontrolü
Bir nesne literal'ini doğrudan tipli bir değişkene atadığınızda ya da doğrudan tipli bir parametreye verdiğinizde TypeScript, tipin bildirmediği her özelliği reddeder. Yeni bir literal'deki fazla özellikler neredeyse her zaman yazım hatasıdır.
index.ts(8,8): error TS2561: Object literal may only specify known properties, but 'colour' does not exist in type 'Options'. Did you mean to write 'color'?
Kod TS2561'dir, çünkü derleyici yakın bir eşleşme buldu; benzer adı olmayan fazla bir özellik TS2353 verir, Object literal may only specify known properties, and 'z' does not exist in type 'Point'. Bu kontrol olmasaydı yazım hatası derlenir, color değeri undefined olur ve program sessizce siyah çizerdi. Kontrol yalnızca yeni literal'lere uygulanır. Zaten bir değişkende duran bir nesne fazla özellikler taşıyabilir, çünkü TypeScript'in tip sistemi yapısaldır: bir değer, en azından gerekli özelliklere sahipse bir tipe uyar.
İç İçe Nesneler ve Metotlar
Nesne tipleri iç içe geçebilir ve metotları hem metot sözdizimiyle hem de fonksiyon tipli bir özellikle tanımlayabilir.
Derin ya da yeniden kullanılan biçimler için iç tipe bir ad verin (type Address = { ... }) ve ona başvurun ya da son satırlardaki gibi dış tipten bir indexed access ile çekip alın: Company["address"].
object, {} ve Object
Birbirine benzeyen üç tip farklı anlamlar taşır:
| Tip | Kabul ettiği | Reddettiği |
|---|---|---|
object | primitive olmayan her şey: {}, [], fonksiyonlar, sınıf örnekleri | 5, "a", true, null, undefined |
{} | primitive'ler dahil null ve undefined dışındaki her değer | null, undefined |
Object | {} ile aynı, artı toString gibi yerleşik üyelerin uyumlu tipleri koruduğunun kontrolü | null, undefined |
{ x: number } | sayısal bir x alanına sahip her değer | x içermeyen değerler |
{} "boş bir nesne" anlamına gelmez; "null veya undefined değil" anlamına gelir. Anahtarları bilinmeyen herhangi bir nesneyi kabul etmek için Record<string, unknown> kullanın; anahtarlardan değerlere bir eşleme için dictionary sayfasında gösterildiği gibi bir index signature ya da Record kullanın. Çoğu zaman belirli bir biçim, bu üçünden daha iyidir.
Sıkça Sorulan Sorular
TypeScript'te bir nesne tipi nasıl tanımlanır?
Özellikleri ve tiplerini süslü parantez içinde listeleyin: { name: string; age: number }. Bunu bir notasyonda satır içi yazabilir ya da type User = { ... } veya interface User { ... } ile ad verip yeniden kullanabilirsiniz. Özellikleri ; veya , ile ayırın.
TypeScript'te bir özellik nasıl opsiyonel yapılır?
Özellik adından sonra ? koyun: { name: string; nickname?: string }. Nesne nickname özelliğini atlayabilir ve onu okumak string | undefined verir; bu yüzden onu string olarak kullanmadan önce kontrol etmeli ya da bir varsayılan vermelisiniz (user.nickname ?? user.name).
prop?: string ile prop: string | undefined arasındaki fark nedir?
prop?: string ile prop: string | undefined arasındaki fark nedir?prop?: string ile anahtar tamamen atlanabilir. prop: string | undefined ile anahtar zorunludur, değeri undefined olabilse de; bu yüzden {} bir derleme hatasıdır. İkisini okumak da string | undefined verir.
TypeScript'te object, {} ve Object arasındaki fark nedir?
object, primitive olmayan herhangi bir değer (nesneler, diziler, fonksiyonlar) anlamına gelir ve 5 ya da "a" değerini reddeder. {}, primitive'ler dahil null ve undefined dışındaki her değer anlamına gelir. Object neredeyse {} ile aynıdır ama toString gibi yerleşik metotların uyumlu tipleri koruduğunu da kontrol eder. {} veya Object yerine object, daha iyisi belirli bir biçim kullanın.
TypeScript neden bir nesne literal'inin yalnızca bilinen özellikleri belirtebileceğinden şikayet ediyor?
Bu, fazla özellik kontrolüdür (excess property check): TS2353 hatası ya da derleyici muhtemelen kastettiğiniz özelliği önerebiliyorsa TS2561. Yeni oluşturulmuş bir nesne literal'ini doğrudan tipli bir değişkene veya parametreye atadığınızda, tipin bildirmediği her özellik işaretlenir, çünkü genellikle bir yazım hatasıdır. Başka bir değişkende saklanan bir nesneyi atamak bu kontrolü atlar, çünkü yapısal tip sistemi fazla özelliklere izin verir.