TypeScript में कार्यात्मक प्रोग्रामिंग: A से Z तक
\n\nकार्यात्मक प्रोग्रामिंग (FP) एक प्रतिमान है जो गणना को गणितीय फ़ंक्शनों के मूल्यांकन के रूप में मानता है और स्थिति में परिवर्तन और परिवर्तनीय डेटा से बचता है। TypeScript, JavaScript का एक सख्ती से टाइप किया गया विस्तार होने के नाते, FP के सिद्धांतों को लागू करने के लिए एक उत्कृष्ट आधार प्रदान करता है, जिससे अधिक पूर्वानुमानित, परीक्षण योग्य और विश्वसनीय कोड लिखा जा सकता है। इस लेख में, हम TypeScript में FP की मुख्य अवधारणाओं को मूल बातों से लेकर उन्नत तकनीकों तक समझेंगे।
\n\nकार्यात्मक प्रोग्रामिंग के मूल सिद्धांत
\n\nकोड में गहराई से जाने से पहले, उन मूलभूत सिद्धांतों को समझना महत्वपूर्ण है जिन पर FP आधारित है।
\n\nशुद्ध फ़ंक्शन (Pure Functions)
\nशुद्ध फ़ंक्शन वह फ़ंक्शन है जो:
\n- \n
- समान तर्कों के लिए हमेशा समान परिणाम लौटाता है (नियतात्मकता)। \n
- इसका कोई दुष्प्रभाव नहीं होता (बाहरी चर नहीं बदलता, कंसोल में डेटा आउटपुट नहीं करता, अनुरोध नहीं भेजता)। \n
शुद्ध फ़ंक्शन का उदाहरण:
\nfunction add(a: number, b: number): number {\n return a + b;\n}\n\n// हमेशा पूर्वानुमानित\nconsole.log(add(2, 3)); // 5\nconsole.log(add(2, 3)); // 5\n\nअशुद्ध फ़ंक्शन का उदाहरण:
\nlet counter = 0;\nfunction increment(): number {\n return ++counter; // दुष्प्रभाव: बाहरी चर में परिवर्तन\n}\n\nअपरिवर्तनीयता (Immutability)
\nडेटा बनने के बाद उसे नहीं बदला जाना चाहिए। मौजूदा ऑब्जेक्ट को बदलने के बजाय, हम आवश्यक परिवर्तनों के साथ उसकी एक नई प्रतिलिपि बनाते हैं।
\ninterface User {\n name: string;\n age: number;\n}\n\nconst user: User = { name: "Alice", age: 30 };\n\n// बुरा (म्यूटेशन)\nuser.age = 31;\n\n// अच्छा (अपरिवर्तनीयता)\nconst updatedUser: User = { ...user, age: 31 };\n\nconsole.log(user); // { name: "Alice", age: 30 } - मूल नहीं बदला\nconsole.log(updatedUser); // { name: "Alice", age: 31 }\n\nTypeScript में संयोजन और करीइंग
\nफ़ंक्शन संयोजन अधिक जटिल फ़ंक्शन बनाने के लिए कई सरल फ़ंक्शनों को संयोजित करने की प्रक्रिया है। करीइंग (currying) एकाधिक तर्कों वाले फ़ंक्शन को फ़ंक्शनों के अनुक्रम में बदलना है, जिनमें से प्रत्येक एक तर्क लेता है।
\n\nफ़ंक्शन संयोजन (Function Composition)
\nTypeScript में संयोजन का टाइप किया गया कार्यान्वयन:
\nfunction compose<A, B, C>(f: (x: B) => C, g: (x: A) => B): (x: A) => C {\n return (x: A) => f(g(x));\n}\n\nconst toUpperCase = (str: string): string => str.toUpperCase();\nconst exclaim = (str: string): string => `${str}!`;\n\nconst shout = compose(exclaim, toUpperCase);\nconsole.log(shout("hello world")); // "HELLO WORLD!"\n\nकरीइंग (Currying)
\nकरी किए गए फ़ंक्शन का उदाहरण:
\nfunction multiply(a: number): (b: number) => number {\n return (b: number) => a * b;\n}\n\nconst double = multiply(2);\nconst triple = multiply(3);\n\nconsole.log(double(5)); // 10\nconsole.log(triple(5)); // 15\nकरीइंग फ़ंक्शनों को अधिक लचीला और संयोजन के लिए सुविधाजनक बनाता है।
\n\nमोनाड के साथ कार्य: Option और Result
\nमोनाड फ़ंक्शनों की शुद्धता का उल्लंघन किए बिना दुष्प्रभावों और त्रुटि प्रबंधन के साथ काम करने के लिए एक शक्तिशाली पैटर्न है। TypeScript में अक्सर Option (या Maybe) और Result (या Either) मोनाड का उपयोग किया जाता है।
Option (Maybe) मोनाड
\nउन मानों के साथ सुरक्षित रूप से काम करने की अनुमति देता है जो null या undefined हो सकते हैं।
type Option<T> = T | null;\n\nfunction safeDivide(a: number, b: number): Option<number> {\n return b === 0 ? null : a / b;\n}\n\nfunction getValue(value: Option<number>): string {\n if (value === null) {\n return "त्रुटि: शून्य से भाग";\n }\n return `परिणाम: ${value}`;\n}\n\nconsole.log(getValue(safeDivide(10, 2)