Geschiedenis van de vraag:
In JavaScript wordt het Date-object gebruikt om datums en tijden weer te geven en staat het bekend om zijn specifieke werking — mutabiliteit, moeilijkheid bij het parseren en kenmerken van tijdzones. TypeScript gebruikt de standaard JS-types voor Date, maar typisering en werken met datum in strikte code vereist een speciale aanpak.
Probleem:
Date in JavaScript is een mutabel object dat ongebruikelijke fouten kan veroorzaken (bijvoorbeeld, setMonth() muteert het object zelf, wat kan leiden tot onverwacht gedrag van de code). Bovendien vereist integratie met externe bibliotheken (moment.js, date-fns, Day.js, enz.) dat je de types nauwgezet volgt — bijvoorbeeld, moment.Instant of specifieke tijd-wrapper types die niet compatibel zijn. Soms kan het geretourneerde type een string of een number (timestamp) zijn, wat leidt tot fouten bij het annoteren van types of het gebruiken van API.
Oplossing:
TypeScript typiseert een nieuw экземпляр Date als Date, en al zijn methoden zijn beschikbaar. Bij integratie met andere bibliotheken is het belangrijk om zorgvuldig te letten op de types van invoer- en uitvoerwaarden — expliciete cast naar Date gebruiken (bijv. new Date(value)), of gebruikerspecifieke container types voor datum en tijd te maken. Voor conversie tussen timestamp (number), string en Date-object moet je de types strikt specificeren en de functies met types of interfaces beschrijven.
Codevoorbeeld:
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('Ongeldige datum'); }
Belangrijke kenmerken:
Is het type "Date" in TypeScript een eenvoudig value type?
Nee, Date is een object, dus een reference type. Vergelijkingen van datums met == of === vergelijken geen waarden, alleen referenties.
const d1 = new Date('2022-01-01'); const d2 = new Date('2022-01-01'); d1 === d2; // false
Kan een string of nummer rechtstreeks aan een Date type worden toegewezen zonder nieuwe initialisatie?
Nee, het Date type is niet compatibel met number of string. Je moet een nieuw экземпляр creëren: new Date(value).
const d: Date = new Date('2020-01-01'); // const d2: Date = '2020-01-01'; // Typefout
Zou een functie die Date accepteert werken met objecten van externe bibliotheken (moment, dayjs)?
Nee, tenzij in de bibliotheek expliciet conversie/compatibiliteit met Date is geïmplementeerd via valueOf/toDate, dit zijn verschillende types en TypeScript zal ze niet als Date herkennen.
import dayjs from "dayjs"; function doSomething(d: Date) { /* ... */ } doSomething(dayjs()); // Fout, omdat het type Dayjs niet compatibel is met Date
In de code werd de argument als any aangenomen, en vervolgens werd aangenomen dat dit een Date was. In de praktijk retourneerde de API een timestamp in string, wat een fout veroorzaakte bij het aanroepen van .getFullYear().
Voordelen:
Nadelen:
De ontwikkelaar maakte een expliciet type voor de parameter (Date | string | number), introduceerde een type guard, en de functie riep new Date expliciet aan. De compiler dwong expliciete behandeling van alle types af.
Voordelen:
Nadelen: