Konu hakkında:
JavaScript'te Date nesnesi tarih ve zamanları temsil etmek için kullanılır ve kendi özellikleriyle bilinir — değiştirilebilirlik, karmaşık ayrıştırma ve zaman dilimi özellikleri gibi. TypeScript, Date için standart JS tiplerini kullanır, ancak katı kodda tarih tiplemesi ve çalışması belirli bir yaklaşım gerektirir.
Sorun:
JavaScript'teki Date, değiştirilebilir bir nesnedir ve alışılmadık hatalar yaratabilir (örneğin, setMonth() nesneyi değiştirdiği için kodun beklenmedik davranışlara yol açmasına neden olabilir). Ayrıca, dış kütüphanelerle (moment.js, date-fns, Day.js vb.) entegrasyon, tiplerin doğruluğunu sağlamak için dikkat edilmesini gerektirir — örneğin, moment.Instant veya birbiriyle uyumsuz özel zaman sarmalayıcıları gibi. Bazen döndürülen tip, string veya number (timestamp) olabilir, bu da tiplerin anotasyonu veya API kullanımı sırasında hatalara yol açabilir.
Çözüm:
TypeScript, yeni bir Date örneğini Date olarak tipler ve tüm yöntemleri kullanıma sunar. Diğer kütüphanelerle entegrasyon sırasında, giriş ve çıkış değerlerinin tiplerini dikkatlice izlemek önemlidir — Date'e açık bir dönüşüm kullanmak (örneğin, new Date(value)) veya tarih ve zaman için özel kapsayıcı türler oluşturmak. Timestamp (number), string ve Date nesnesi arasında dönüştürme yapmak için tipleri kesin bir şekilde belirtmek ve fonksiyonları tipler veya arayüzler ile tanımlamak gereklidir.
Kod örneği:
function toIsoString(d: Date | number | string): string { if (d instanceof Date) return d.toISOString(); if (typeof d === 'number' || typeof d === 'string') return new Date(d).toISOString(); throw new Error('Geçersiz tarih'); }
Anahtar özellikler:
TypeScript'teki "Date" tipi basit bir value type mıdır?
Hayır, Date bir nesnedir, yani reference type. Tarihlerin == veya === ile karşılaştırılması değerleri değil, yalnızca referansları karşılaştırır.
const d1 = new Date('2022-01-01'); const d2 = new Date('2022-01-01'); d1 === d2; // false
Yeni bir başlangıç yapılmadan doğrudan string veya number'ı Date tipine atamak mümkün müdür?
Hayır, Date tipi number veya string ile uyumlu değildir. Yeni bir örnek oluşturmak gereklidir: new Date(value).
const d: Date = new Date('2020-01-01'); // const d2: Date = '2020-01-01'; // Tip hatası
Date alan bir fonksiyon, dış kütüphanelerden (moment, dayjs gibi) gelen nesnelerle çalışır mı?
Hayır, eğer kütüphanede açıkça Date ile uyum sağlamak için valueOf/toDate gibi bir dönüşüm uygulanmıyorsa, bu farklı tiplerdir ve TypeScript onları Date olarak tanımaz.
import dayjs from "dayjs"; function doSomething(d: Date) { /* ... */ } doSomething(dayjs()); // Hata, çünkü Dayjs tipi Date ile uyumlu değil
Koda argüman any olarak alındı ve bunun Date olduğu varsayıldı. Pratikte API timestamp'i bir string olarak döndürdü ve bu da .getFullYear() çağrılırken hata yaşanmasına neden oldu.
Artılar:
Eksiler:
Geliştirici, parametre (Date | string | number) için açık bir tip oluşturdu, type guard kullandı ve fonksiyon açıkça new Date çağırarak döndü. Derleyici, tüm tipleri açıkça işlemeye zorlar.
Artılar:
Eksiler: