TypeScript Academy · पाठ

स्टेट मशीन का मॉडल बनाना

भेदकारी यूनियन के साथ सीमित अवस्थाओं को दर्शाएँ।

पाठ 4, कुल 4 में से13 चरण

स्टेट मशीन का मॉडल बनाना, CoddyKit पर TypeScript Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह TypeScript Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। TypeScript Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

विभेदित यूनियन के रूप में अवस्थाएँ

उपयोगकर्ता इंटरफ़ेस और अतुल्यकालिक प्रवाह में अलग-अलग अवस्थाएँ होती हैं: निष्क्रिय, लोड हो रहा है, सफल और त्रुटि। उन्हें विभेदित यूनियन के रूप में मॉडल करने से हर अवस्था में ठीक वही डेटा रहता है जिसकी उसे आवश्यकता है।

type State =
  | { status: "idle" }
  | { status: "loading" }
  | { status: "success"; data: string }
  | { status: "error"; message: string };

const s: State = { status: "idle" };
console.log(s.status);

हर अवस्था के लिए डेटा

केवल success अवस्था में data होता है और केवल error अवस्था में message होता है। निष्क्रिय और लोड हो रही अवस्थाओं में कुछ अतिरिक्त नहीं होता, जिससे पुराना डेटा अवस्थाओं के बीच लीक होने से रुकता है।

type State =
  | { status: "idle" }
  | { status: "loading" }
  | { status: "success"; data: number[] }
  | { status: "error"; message: string };

const ok: State = { status: "success", data: [1, 2, 3] };
console.log(ok.status, "data" in ok ? ok.data : null);

हर अवस्था को रेंडर करना

status पर switch करने वाला फ़ंक्शन हर अवस्था के लिए सही आउटपुट रेंडर कर सकता है और सदस्य के फ़ील्ड केवल वहीं उपलब्ध होते हैं जहाँ वे मौजूद हैं।

type State =
  | { status: "idle" }
  | { status: "loading" }
  | { status: "success"; data: string }
  | { status: "error"; message: string };

function view(s: State): string {
  switch (s.status) {
    case "idle": return "Ready";
    case "loading": return "Loading...";
    case "success": return "Got: " + s.data;
    case "error": return "Failed: " + s.message;
  }
}
console.log(view({ status: "success", data: "users" }));

संक्रमण परिभाषित करना

अवस्था मशीन संक्रमणों के माध्यम से एक अवस्था से दूसरी अवस्था में जाती है। संक्रमण फ़ंक्शन वर्तमान अवस्था और किसी इवेंट को लेकर अगली अवस्था लौटाता है।

type State =
  | { status: "idle" }
  | { status: "loading" }
  | { status: "success"; data: string }
  | { status: "error"; message: string };

function start(s: State): State {
  if (s.status === "idle") return { status: "loading" };
  return s;
}
console.log(start({ status: "idle" }).status);

इवेंट का भी मॉडल बनाना

इवेंट स्वयं भी विभेदित यूनियन हो सकते हैं। हर इवेंट प्रकार एक विशिष्ट संक्रमण शुरू करता है।

type Event =
  | { type: "FETCH" }
  | { type: "RESOLVE"; data: string }
  | { type: "REJECT"; message: string };

const e: Event = { type: "RESOLVE", data: "ok" };
console.log(e.type);

एक पूर्ण संक्रमण फ़ंक्शन

एक ही रिड्यूसर में अवस्था और इवेंट यूनियन को संयोजित करें। दोनों पर switch करने से हर संक्रमण स्पष्ट और प्रकार-सुरक्षित रहता है।

type State =
  | { status: "idle" }
  | { status: "loading" }
  | { status: "success"; data: string }
  | { status: "error"; message: string };
type Event =
  | { type: "FETCH" }
  | { type: "RESOLVE"; data: string }
  | { type: "REJECT"; message: string };

function reduce(s: State, e: Event): State {
  if (e.type === "FETCH") return { status: "loading" };
  if (e.type === "RESOLVE") return { status: "success", data: e.data };
  return { status: "error", message: e.message };
}
console.log(reduce({ status: "idle" }, { type: "FETCH" }).status);

अवैध अवस्थाओं को निरूपित करना असंभव है

आपके पास एक ही समय में data और error message नहीं हो सकते। यूनियन का डिज़ाइन निर्माण के स्तर पर विरोधाभासी अवस्थाओं को रोकता है।

type State =
  | { status: "success"; data: string }
  | { status: "error"; message: string };

// const bad: State = { status: "success", data: "x", message: "y" };
// Allowed extra props would be flagged in strict object checks.
console.log("no contradictory states");

अमान्य संक्रमणों से सुरक्षा

आप उन इवेंट को अनदेखा कर सकते हैं जो वर्तमान अवस्था पर लागू नहीं होते। इससे मशीन क्रैश होने के बजाय एक सुसंगत अवस्था में बनी रहती है।

type State = { status: "idle" } | { status: "loading" };
type Event = { type: "FETCH" } | { type: "CANCEL" };

function reduce(s: State, e: Event): State {
  if (s.status === "loading" && e.type === "CANCEL") return { status: "idle" };
  if (s.status === "idle" && e.type === "FETCH") return { status: "loading" };
  return s; // ignore invalid combos
}
console.log(reduce({ status: "loading" }, { type: "CANCEL" }).status);

संपूर्णता-जाँच जोड़ना

रिड्यूसर के साथ assertNever का उपयोग करें, ताकि नई अवस्था या इवेंट जोड़ने पर हर वह स्थान सामने आ जाए जिसे आपको अपडेट करना है।

function assertNever(x: never): never { throw new Error("unhandled"); }
type State = { status: "idle" } | { status: "loading" } | { status: "done"; data: string };

function view(s: State): string {
  switch (s.status) {
    case "idle": return "idle";
    case "loading": return "loading";
    case "done": return s.data;
    default: return assertNever(s);
  }
}
console.log(view({ status: "done", data: "ok" }));

आरंभिक और अंतिम अवस्थाएँ

एक स्पष्ट आरंभिक अवस्था, अक्सर idle, और अंतिम अवस्थाएँ, success या error, निर्धारित करें। इससे मशीन का जीवनचक्र दर्ज होता है।

type State =
  | { status: "idle" }
  | { status: "loading" }
  | { status: "success"; data: string }
  | { status: "error"; message: string };

const initial: State = { status: "idle" };
console.log("Start:", initial.status);

एक पूर्ण लघु अवस्था मशीन

पूरा चक्र इस प्रकार है: निष्क्रिय अवस्था से शुरू करें, लोड होने के लिए फ़ेच करें और सफल अवस्था में पहुँचें। प्रकार हर चरण को सही बनाए रखते हैं।

type State = { status: "idle" } | { status: "loading" } | { status: "success"; data: string };
type Event = { type: "FETCH" } | { type: "RESOLVE"; data: string };

function reduce(s: State, e: Event): State {
  if (e.type === "FETCH") return { status: "loading" };
  return { status: "success", data: e.data };
}
let st: State = { status: "idle" };
st = reduce(st, { type: "FETCH" });
st = reduce(st, { type: "RESOLVE", data: "hi" });
console.log(st.status, st.status === "success" ? st.data : "");

त्वरित जाँच: अवस्था मशीनें

अवस्था मशीनों का मॉडल बनाने की अपनी समझ जाँचें।

पुनरावलोकन: अवस्था मशीनों का मॉडल बनाना

आपने निष्क्रिय, लोड हो रही, सफल और त्रुटि अवस्थाओं को विभेदित यूनियन के रूप में मॉडल किया, अवस्था और इवेंट यूनियन पर प्रकार-सुरक्षित संक्रमण लिखे, और मशीन के बढ़ने के साथ उसे सही बनाए रखने के लिए संपूर्णता-जाँच का उपयोग किया।

type State = { status: "idle" } | { status: "loading" } | { status: "success"; data: string };
const s: State = { status: "success", data: "done" };
console.log(s.status === "success" ? s.data : "");
शुरुआत निःशुल्क

एआई शिक्षक के साथ TypeScript सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
101
पाठ
352

अक्सर पूछे जाने वाले प्रश्न

क्या “स्टेट मशीन का मॉडल बनाना” पाठ निःशुल्क है?

हाँ—“स्टेट मशीन का मॉडल बनाना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और TypeScript Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। TypeScript Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“स्टेट मशीन का मॉडल बनाना” में मैं क्या सीखूँगा?

भेदकारी यूनियन के साथ सीमित अवस्थाओं को दर्शाएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ TypeScript Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या TypeScript Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर TypeScript Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“स्टेट मशीन का मॉडल बनाना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस TypeScript Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर TypeScript Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. भेदकारी यूनियन बनाना
  2. भेदकारी के आधार पर संकीर्ण करना
  3. never के साथ पूर्णता जाँच
  4. स्टेट मशीन का मॉडल बनाना
← TypeScript Academy पर वापस जाएँ