ओवरलोड रिज़ॉल्यूशन, this छद्म-पैरामीटर, और उन वेरिएंस नियमों को समझें जो फ़ंक्शन असाइनेबिलिटी को नियंत्रित करते हैं।
इस पाठ को Kodokon में खोलेंएक ओवरलोडेड फ़ंक्शन सार्वजनिक सिग्नेचरों की एक सूची उजागर करता है जिसके बाद एक एकल इंप्लीमेंटेशन सिग्नेचर होता है। एक आवश्यक विनिर्देश बिंदु: उत्तरार्द्ध बाहर से अदृश्य होता है; केवल घोषित ओवरलोड्स को ही कॉल किया जा सकता है। रिज़ॉल्यूशन सिग्नेचरों पर ऊपर से नीचे चलता है और पहले संगत को रखता है: सबसे विशिष्ट सिग्नेचर को हमेशा पहले रखें, अन्यथा उसे कभी नहीं चुना जाएगा।
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 के साथ उपयोग किए जाने वाले फ़ंक्शनों को टाइप करने के लिए आवश्यक है।
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वेरिएंस यह वर्णन करता है कि असाइनेबिलिटी एक टाइप कंस्ट्रक्टर के माध्यम से कैसे फैलती है। फ़ंक्शनों के लिए, रिटर्न टाइप्स सहचर (covariant) होते हैं और, strictFunctionTypes के साथ, पैरामीटर प्रतिचर (contravariant) होते हैं: एक फ़ंक्शन जो व्यापक टाइप स्वीकार करता है, वह उस फ़ंक्शन की जगह ले सकता है जो संकरा टाइप स्वीकार करता है, कभी उल्टा नहीं। एक जानबूझकर किया गया अपवाद: शॉर्टहैंड सिंटैक्स में घोषित मेथड्स के पैरामीटर द्विचर (bivariant) रहते हैं, एक ऐतिहासिक समझौता जिसके बिना Array<Dog> को Array<Animal> को असाइन नहीं किया जा सकता। 4.7 से, आप अपेक्षित वेरिएंस को in और out के साथ एनोटेट कर सकते हैं, उदाहरण के लिए interface Producer<out T>, और कंपाइलर इसे सत्यापित करता है।
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!this पैरामीटर का क्या होता है?