ProgramlamaFull Stack Geliştirici

Tarih ve zaman tiplerinin TypeScript'teki çalışma şeklini açıklayın. Tarih ve zamanla doğru tiplerin nasıl tanımlanacağı ve dış kütüphaneler veya yerel Date ile entegrasyon sırasında hangi sorunların ortaya çıkabileceği hakkında bilgi verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Date — değiştirilebilir bir nesne, value type değil, reference type.
  • API veya dış kütüphanelerden tarih alma ve verme işlemleri, tip uyumluluğunun sıkı bir şekilde korunmasını gerektirir.
  • Dış sarmalayıcılar (moment, dayjs gibi) açıkça özel türler ve/veya type guard fonksiyonları talep eder.

Zorlayıcı Sorular.

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

Tip Hataları ve Anti-Paternerler

  • API ile entegrasyonda tarihi belirtmek için any gibi herhangi bir tip kullanmak.
  • Date nesnesinin (set*, setUTC*) birden fazla fonksiyona geçirilmesi durumunda mutasyona uğratılması — risk koşul yaratarak.
  • Tiplerin uyumsuzluğu: dış bir tip ile Date olarak çalışmaya çalışmak.

Gerçek Hayat Örneği

Olumsuz Durum

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:

  • Derleme hatası olmadan "her şeyle çalışabilme".

Eksiler:

  • Çalışma zamanında hatalar riski.
  • Prod'de hataları yakalamakta zorluk.

Olumlu Durum

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:

  • Derleme aşamasında hatalar daha şeffaf hale gelir.
  • Farklı tarih türleri ile çalışma daha güvenilir olur.

Eksiler:

  • Biraz daha fazla şablon kodu (type guards).
  • Dış kütüphanelerin tip yapısına dair bilgi sahibi olmayı gerektirir.