Kodokon kodokon.com

ओवरलोड्स, टाइप्ड this, और वेरिएंस

ओवरलोड रिज़ॉल्यूशन, this छद्म-पैरामीटर, और उन वेरिएंस नियमों को समझें जो फ़ंक्शन असाइनेबिलिटी को नियंत्रित करते हैं।

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

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

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

TYPESCRIPT
function parse(input: string): number;
function parse(input: string[]): number[];
function parse(input: string | string[]) {
  return Array.isArray(input)
    ? input.map((s) => s.length)
    : input.length;
}

const single = parse("abc");      // number
const many = parse(["a", "bb"]);  // number[]
प्रत्येक कॉल एक सटीक ओवरलोड में रिज़ॉल्व होती है।

TypeScript आपको पहली स्थिति में एक this छद्म-पैरामीटर घोषित करने देता है। यह उत्सर्जित JavaScript से पूरी तरह मिटा दिया जाता है: यह कॉल संदर्भ पर एक विशुद्ध रूप से स्थैतिक कंस्ट्रेंट है, जिसे noImplicitThis सक्षम होने पर जांचा जाता है। ThisParameterType और OmitThisParameter यूटिलिटीज़ आपको इसे निकालने या हटाने देती हैं, जो call, apply, या bind के साथ उपयोग किए जाने वाले फ़ंक्शनों को टाइप करने के लिए आवश्यक है।

TYPESCRIPT
function greet(this: { name: string }, msg: string) {
  return `${msg}, ${this.name}`;
}

type Ctx = ThisParameterType<typeof greet>;
// { name: string }
type Fn = OmitThisParameter<typeof greet>;
// (msg: string) => string

const user = { name: "Ada", greet };
user.greet("Hello"); // "Hello, Ada"

// greet("Hi"); // error: missing this context
this पैरामीटर कॉल स्थल को बांधता है, उत्सर्जित JS को नहीं।

वेरिएंस यह वर्णन करता है कि असाइनेबिलिटी एक टाइप कंस्ट्रक्टर के माध्यम से कैसे फैलती है। फ़ंक्शनों के लिए, रिटर्न टाइप्स सहचर (covariant) होते हैं और, strictFunctionTypes के साथ, पैरामीटर प्रतिचर (contravariant) होते हैं: एक फ़ंक्शन जो व्यापक टाइप स्वीकार करता है, वह उस फ़ंक्शन की जगह ले सकता है जो संकरा टाइप स्वीकार करता है, कभी उल्टा नहीं। एक जानबूझकर किया गया अपवाद: शॉर्टहैंड सिंटैक्स में घोषित मेथड्स के पैरामीटर द्विचर (bivariant) रहते हैं, एक ऐतिहासिक समझौता जिसके बिना Array<Dog> को Array<Animal> को असाइन नहीं किया जा सकता। 4.7 से, आप अपेक्षित वेरिएंस को in और out के साथ एनोटेट कर सकते हैं, उदाहरण के लिए interface Producer<out T>, और कंपाइलर इसे सत्यापित करता है।

TYPESCRIPT
interface Animal { name: string }
interface Dog extends Animal { bark(): void }

declare let f: (a: Dog) => void;
declare let g: (a: Animal) => void;

f = g; // OK: g accepts a wider type, that is safe
// g = f; // error with strictFunctionTypes

interface Sink { accept(a: Animal): void }
interface DogSink { accept(a: Dog): void }
declare let s: Sink;
declare let d: DogSink;

d = s; s = d; // both compile: bivariance!
सख्त फ़ंक्शन प्रॉपर्टीज़, द्विचर मेथड्स।

ज्ञान जांच

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

  1. एक ओवरलोडेड फ़ंक्शन को कॉल करते समय, कंपाइलर कौन सा सिग्नेचर चुनता है?
    • सबसे सामान्य सिग्नेचर
    • घोषणा क्रम में पहला संगत सिग्नेचर
    • इंप्लीमेंटेशन सिग्नेचर
    • सभी सिग्नेचरों का यूनियन
  2. उत्सर्जित JavaScript में एक फ़ंक्शन के this पैरामीटर का क्या होता है?
    • यह एक असली पहला तर्क बन जाता है
    • यह गायब हो जाता है: यह एक विशुद्ध रूप से स्थैतिक एनोटेशन है
    • इसे bind की कॉल से बदल दिया जाता है
    • गायब होने पर यह एक रनटाइम त्रुटि का कारण बनता है
  3. strictFunctionTypes के साथ, कौन सा सिंटैक्स सख्त प्रतिचर पैरामीटर जांच का लाभ उठाता है?
    • शॉर्टहैंड सिंटैक्स में मेथड्स, जैसे m(a: X): void
    • फ़ंक्शन-टाइप्ड प्रॉपर्टीज़, जैसे m: (a: X) => void
    • दोनों सिंटैक्स
    • इनमें से कोई नहीं