Kodokon kodokon.com

Literal types और discriminated unions

अपने application की states को उन unions से मॉडल करें जिन्हें compiler आपकी ओर से जाँचता है।

8 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

एक literal type किसी value को सटीक content तक सीमित कर देता है: string के बजाय 'info'। यह उन APIs की नींव है जिनका ग़लत इस्तेमाल असंभव है: compiler सूची के बाहर की किसी भी value को अस्वीकार कर देता है, और आपका editor autocompletion देता है।

TYPESCRIPT
type Level = "info" | "warn" | "error";

function log(level: Level, message: string): void {
  console.log(`[${level}] ${message}`);
}

log("info", "Server started");
// log("fatal", "Boom"); -> rejected by the compiler
literals का एक union अनुमत values को बंद कर देता है

अगला कदम है ऐसे object types को मिलाना जो एक साझा literal property साझा करते हैं, जिसे discriminant कहते हैं। किसी network call की हर state, उदाहरण के लिए, केवल वही data रखती है जो उससे संबंधित है: loading के दौरान data तक पहुँचना बस असंभव है।

TYPESCRIPT
type ApiState =
  | { status: "loading" }
  | { status: "success"; data: string[] }
  | { status: "error"; message: string };

function render(state: ApiState): string {
  switch (state.status) {
    case "loading":
      return "Loading...";
    case "success":
      return state.data.join(", ");
    case "error":
      return state.message;
  }
}
status property द्वारा discriminated एक union

हर case में, TypeScript type को narrow कर देता है: case 'error' के बाद, state.message मौजूद है और state.data नहीं। यह तंत्र, जिसे narrowing कहते हैं, नाज़ुक manual जाँचों की जगह ले लेता है। पूरे चीज़ को बंद करने के लिए एक exhaustiveness guard जोड़ें।

TYPESCRIPT
function assertNever(value: never): never {
  throw new Error("Unhandled case: " + String(value));
}

function label(state: ApiState): string {
  switch (state.status) {
    case "loading": return "In progress";
    case "success": return "Done";
    case "error": return "Failed";
    default: return assertNever(state);
  }
}
never type के साथ exhaustiveness guard

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. किसी discriminated union में, status जैसी साझा property की भूमिका क्या होती है?
    • runtime performance को बेहतर करना
    • compiler को हर branch में type narrow करने देना
    • प्राप्त JSON में property को आवश्यक बनाना
    • duplicate properties को रोकना
  2. type Level = 'info' | 'warn' के साथ, log(level, msg) की कौन-सी call compile होती है?
    • log('debug', msg)
    • log('info', msg)
    • log(someString, msg) जहाँ someString का type string है
  3. किसी switch की default branch में assertNever(value: never) function का उद्देश्य क्या है?
    • production में errors log करना
    • किसी भूले हुए case को compile error में बदलना
    • value को never में बदलना
    • program को तेज़ी से समाप्त करना