TypeScript में कार्यात्मक प्रोग्रामिंग: सिद्धांत से व्यवहार तक
कार्यात्मक प्रोग्रामिंग (FP) एक प्रतिमान है जो फ़ंक्शन के अनुप्रयोग के माध्यम से गणना और स्थिति में बदलाव से बचने पर आधारित है। TypeScript, JavaScript का एक कड़ाई से टाइप किया गया सुपरसेट होने के नाते, FP को लागू करने के लिए शक्तिशाली उपकरण प्रदान करता है। इस लेख में, हम व्यावहारिक कोड उदाहरणों के साथ TypeScript में कार्यात्मक प्रोग्रामिंग की प्रमुख अवधारणाओं पर चर्चा करेंगे।
1. शुद्ध फ़ंक्शन और अपरिवर्तनीयता
शुद्ध फ़ंक्शन वह फ़ंक्शन है जो:
- समान तर्कों के लिए हमेशा एक ही परिणाम लौटाता है (नियतिवाद)।
- इसका कोई दुष्प्रभाव नहीं होता (बाहरी चर नहीं बदलता, I/O संचालन नहीं करता)।
// शुद्ध फ़ंक्शनconst add = (a: number, b: number): number => a + b;
// अशुद्ध फ़ंक्शन (दुष्प्रभाव — बाहरी स्थिति में परिवर्तन)let counter = 0;const increment = (): number => ++counter;अपरिवर्तनीयता का अर्थ है कि डेटा बदला नहीं जाता, बल्कि नई प्रतियां बनाई जाती हैं। TypeScript में, आप spread ऑपरेटर और बिना उत्परिवर्तन वाली विधियों का उपयोग कर सकते हैं:
interface User { name: string; age: number;}
// उत्परिवर्तन (बुरा)const updateAgeMutable = (user: User, newAge: number): void => { user.age = newAge;};
// अपरिवर्तनीय दृष्टिकोण (अच्छा)const updateAgeImmutable = (user: User, newAge: number): User => ({ ...user, age: newAge,});अपरिवर्तनीयता डिबगिंग और परीक्षण को सरल बनाती है, क्योंकि डेटा हमेशा पूर्वानुमानित होता है।
2. उच्च-क्रम फ़ंक्शन और क्लोजर
उच्च-क्रम फ़ंक्शन वे फ़ंक्शन हैं जो अन्य फ़ंक्शन को तर्क के रूप में लेते हैं या उन्हें लौटाते हैं। उदाहरण — Array.map विधि:
const numbers: number[] = [1, 2, 3, 4];const doubled: number[] = numbers.map((x) => x * 2);console.log(doubled); // [2, 4, 6, 8]क्लोजर एक फ़ंक्शन है जो बाहरी दायरे के चर को "याद" रखता है, भले ही बाहरी फ़ंक्शन ने अपना निष्पादन पूरा कर लिया हो:
const createMultiplier = (factor: number): ((x: number) => number) => { return (x: number) => x * factor;};
const double = createMultiplier(2);const triple = createMultiplier(3);
console.log(double(5)); // 10console.log(triple(5)); // 15क्लोजर का व्यापक रूप से आंशिक तर्क अनुप्रयोग (करीइंग) वाले फ़ंक्शन बनाने के लिए उपयोग किया जाता है।
3. फ़ंक्शन संयोजन और करीइंग
फ़ंक्शन संयोजन कई फ़ंक्शन को एक में जोड़ना है, जहां एक फ़ंक्शन का आउटपुट अगले के लिए इनपुट होता है। TypeScript में, आप संयोजन के लिए एक उपयोगिता लिख सकते हैं:
const compose = <T, R>(...fns: Array<(arg: T) => T>) => (arg: T): T => fns.reduceRight((acc, fn) => fn(acc), arg);
// उदाहरण: स्ट्रिंग रूपांतरणconst toUpperCase = (s: string): string => s.toUpperCase();const exclaim = (s: string): string => `${s}!`;const shout = compose(toUpperCase, exclaim);
console.log(shout("hello")); // "HELLO!"करीइंग कई तर्कों वाले फ़ंक्शन को एक तर्क वाले फ़ंक्शन के अनुक्रम में बदलना है:
// सामान्य फ़ंक्शनconst add = (a: number, b: number): number => a + b;
// करीड संस्करणconst curriedAdd = (a: number) => (b: number): number => a + b;
const add5 = curriedAdd(5);console.log(add5(3)); // 8करीइंग विशिष्ट फ़ंक्शन बनाने को सरल बनाता है और कोड पुन: प्रयोज्यता बढ़ाता है।
4. मोनाड और Option/Maybe के साथ कार्य
मोनाड एक कार्यात्मक प्रोग्रामिंग पैटर्न है जो एक मान को समाहित करता है और उसके रूपांतरण के लिए एक इंटरफ़ेस प्रदान करता है। सबसे सरल मोनाड में से एक Maybe (या Option) है, जो सुरक्षित रूप से n