TypeScript में तिथियाँ: सही प्रकार कैसे घोषित करें और पागल न हों

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

TypeScript में «Date» एक जाल क्यों है?

\n

कल्पना करें: आप एक एप्लिकेशन लिख रहे हैं, सब कुछ पूरी तरह से काम कर रहा है। लेकिन एक दिन एक बग रिपोर्ट आती है: «टोक्यो का उपयोगकर्ता तिथि एक दिन पहले देखता है»। आप कोड खोलते हैं और क्लासिक देखते हैं: let date: Date = "2024-12-01"। या उससे भी बुरा — any। परिचित लगता है?

\n

प्रश्न «How do I express a date type in TypeScript?» ने Stack Overflow पर हजारों व्यूज प्राप्त किए हैं। और यह सही भी है। ऐसा लगता है कि उत्तर सरल है: Date का उपयोग करें। लेकिन व्यवहार में यह अधिक जटिल है। TypeScript JavaScript के ऊपर एक परत है, और JS में Date एक ऑब्जेक्ट है जो... अजीब व्यवहार करता है।

\n

इस लेख में हम केवल सिंटैक्स नहीं, बल्कि तिथियों की सही टाइपिंग पर चर्चा करेंगे, जो आपके प्रोजेक्ट को बग्स से बचाएगी, प्रदर्शन बढ़ाएगी और कोड को टीम के लिए समझने योग्य बनाएगी। आप सीखेंगे कि TypeScript में वास्तविक तिथियों के साथ कैसे काम करें, बिना डिबगिंग में समय खोए।

\n\n

1. बुनियादी टाइपिंग: Date, string या number?

\n

सबसे स्पष्ट विकल्प बिल्ट-इन प्रकार Date है:

\n
let birthday: Date = new Date('1990-05-15');
\n

काम करता है? हाँ। लेकिन एक बारीकी है: TypeScript यह जाँच नहीं करता कि तिथि मान्य है या नहीं। आप new Date('abc') लिख सकते हैं — कोई कंपाइलेशन त्रुटि नहीं होगी, लेकिन रनटाइम पर आपको Invalid Date मिलेगा। और .getTime() कॉल करने का प्रयास NaN लौटाएगा।

\n

अधिक सख्त विकल्प ISO 8601 प्रारूप में स्ट्रिंग्स का उपयोग करना है:

\n
type ISODateString = string;\nlet eventDate: ISODateString = '2024-12-01T10:00:00Z';
\n

लाभ: सरल प्रकार, JSON में आसानी से सीरियलाइज़ होता है। नुकसान: कोई सत्यापन नहीं — आप 'hello' असाइन कर सकते हैं, और TS चुप रहेगा।

\n

तीसरा विकल्प — timestamp (number):

\n
type Timestamp = number;\nlet ms: Timestamp = Date.now();
\n

गणितीय संचालन के लिए आदर्श, लेकिन मनुष्यों के लिए अपठनीय। और फिर — कोई भी संख्या जाँच पास करेगी।

\n\n

बुनियादी प्रकारों का सारांश

\n

यदि आपको त्वरित और गंदी टाइपिंग चाहिए — Date का उपयोग करें। यदि API के साथ काम कर रहे हैं — string। यदि केवल गणना — number। लेकिन गंभीर प्रोजेक्ट्स के लिए यह पर्याप्त नहीं है। आइए गहराई में जाएँ।

\n\n

2. कस्टम प्रकार और ब्रांडेड टाइपिंग (branded types)

\n

TypeScript को तिथि-स्ट्रिंग को सामान्य स्ट्रिंग से भ्रमित न करने देने के लिए, ब्रांडेड प्रकार का उपयोग किया जाता है। यह एक स्टिकर की तरह है «मैं एक तिथि हूँ, सत्यापित!»:

\n
type DateString = string & { __brand: 'DateString' };\n\nfunction toDateString(date: Date): DateString {\n    return date.toISOString() as DateString;\n}\n\nfunction processDate(d: DateString) {\n    // यहाँ d निश्चित रूप से ISO-स्ट्रिंग है\n}\n\nconst iso = toDateString(new Date());\nprocessDate(iso); // ठीक है\n// processDate('hello'); // ❌ त्रुटि!
\n

यह कंपाइलेशन चरण पर सुरक्षा जोड़ता है। कीमत — थोड़ा अधिक कोड। लेकिन बड़े प्रोजेक्ट्स के लिए (विशेषकर यदि आपके पास माइक्रोसर्विसेज या REST API हैं) यह स्वर्ण मानक है।

\n\n

3. TypeScript में तिथियों के साथ काम करने के लिए लाइब्रेरीज़

\n

कच्चा Date बुराई है। यह म्यूटेबल है, स्ट्रिंग्स को असंगत रूप से पार्स करता है, और टाइमज़ोन एक अलग दर्द है। इसलिए वास्तविक प्रोजेक्ट्स में लाइब्रेरीज़ का उपयोग किया जाता है। यहाँ तीन पसंदीदा हैं:

\n\n

3.1. date-fns (हल्की और मॉड्यूलर)

\n
import { format, parseISO } from 'date-fns';\n\nconst date: Date = parseISO('2024-12-01T10:00:00Z');\nconst formatted: string = format(date, 'dd.MM.yyyy');
\n

लाभ: tree-shaking, immutable (नई तिथियाँ लौटाता है), उत्कृष्ट टाइपिंग।

\n\n

3.2. Day.js (न्यूनतम)

\n
import dayjs, { Dayjs } from 'dayjs';\n\nconst now: Dayjs = dayjs();\nconst formatted: string = now.format('DD.MM.YYYY');
\n

Day.js Moment.js जैसा है, लेकिन भारी बंडल के बिना। प्रकार Dayjs एक रैपर है जिसे फंक्शन्स के बीच आसानी से पास किया जा सकता है।

\n\n

3.3. Luxon (

ब्लॉग

पुस्तक अनुशंसाएँ