Kodokon kodokon.com

Generics: सरल generic functions और types

ऐसे पुन: प्रयोग योग्य functions और types लिखें जो हर call पर पूरी type सटीकता बनाए रखें।

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

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

आप बिना जाने ही generics का इस्तेमाल करते हैं: string[], Promise<number>... अब अपने ख़ुद के लिखने का समय है। एक generic एक type parameter पेश करता है, एक ऐसा variable जिसे हर उपयोग पर एक ठोस type से बदल दिया जाता है। लक्ष्य: logic एक बार लिखें, type सटीकता का त्याग किए बिना।

TYPESCRIPT
function first<T>(items: T[]): T | undefined {
  return items[0];
}

const n = first([10, 20, 30]);
const s = first(["a", "b"]);
T का अनुमान लगाया जाता है: n है number | undefined, s है string | undefined

ध्यान दें कि आपने call साइट पर कुछ भी निर्दिष्ट नहीं किया: TypeScript argument से T का अनुमान लगाता है। एक बिना-constraint वाला generic कुछ भी स्वीकार करता है; फिर भी किसी function को अक्सर अपने data के बारे में न्यूनतम गारंटी की ज़रूरत होती है। extends keyword T पर एक न्यूनतम shape लागू करता है।

TYPESCRIPT
interface HasId {
  id: number;
}

function findById<T extends HasId>(
  items: T[],
  id: number
): T | undefined {
  return items.find((item) => item.id === id);
}
Constraint: T के पास कम से कम एक numeric id होना चाहिए

Types स्वयं generic हो सकते हैं। यह network code में रोज़मर्रा की बात है: response की संरचना स्थिर होती है, केवल data की सामग्री बदलती है। तब एक ही type आपकी सभी API responses का वर्णन करता है।

TYPESCRIPT
interface ApiResponse<T> {
  ok: boolean;
  data: T;
}

type UserResponse = ApiResponse<{ name: string }>;

const res: UserResponse = {
  ok: true,
  data: { name: "Ada" },
};
एक generic type data की सामग्री को parameterize करता है

ज्ञान जांच

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

  1. function first<T>(items: T[]): T | undefined में, T किसका प्रतिनिधित्व करता है?
    • एक बार में हमेशा के लिए परिभाषित एक ठोस type
    • हर call पर बदला जाने वाला एक type parameter
    • unknown type
    • any के लिए एक संक्षिप्त रूप
  2. constraint <T extends HasId> क्या गारंटी देता है?
    • T बिल्कुल HasId type है
    • T के पास कम से कम HasId की properties हैं
    • T, HasId class से विरासत में मिलता है
  3. आप बिना type निर्दिष्ट किए first([10, 20, 30]) call करते हैं। T क्या है?
    • any
    • unknown
    • number
    • 10 | 20 | 30