पाठ 20 / 28

जेनेरिक इंटरफ़ेस, क्लास और कंस्ट्रेंट्स

Generic interfaces और classes बनाएँ और reusable, safe code के लिए extends constraints से type parameters सीमित करें।

जेनेरिक इंटरफ़ेस और क्लास

जेनेरिक क्लास या इंटरफ़ेस, एक ही परिभाषा को कई पेलोड टाइप्स के लिए दोबारा उपयोग करता है — Box<string> और Box<number> एक ही आकार साझा करते हैं।

interface Box<T> {
  value: T;
}

class Container<T> {
  constructor(public value: T) {}
  get(): T {
    return this.value;
  }
}

const c = new Container<number>(42);

extends से सीमित करना

T extends { length: number }, T को उन टाइप्स तक सीमित करता है जिनमें कम से कम length प्रॉपर्टी हो — "कुछ भी" से संकरा, पर दोबारा-उपयोगी होने लायक पर्याप्त चौड़ा।

function logLength<T extends { length: number }>(item: T): void {
  console.log(item.length);
}

logLength("hello");     // OK, strings have length
logLength([1, 2, 3]);   // OK, arrays have length
logLength(42);
// Error: Argument of type 'number' is not assignable to parameter of type '{ length: number }'.

जेनेरिक्स को सार्थक नाम दें

एक जेनेरिक के लिए T ठीक है। कई होने पर, T, U, V की जगह पठनीय नाम पसंद करें — TKey, TValue।