टाइपप्रति में सरणी का विस्तार

वोट
32

कैसे एक आधार प्रकार के लिए एक विधि को जोड़ने के लिए, सरणी कहा? वैश्विक मॉड्यूल में इस पहचाना जाएगा

interface Array {
   remove(o): Array;
}

लेकिन जहां वास्तविक क्रियान्वयन डाल करने के लिए?

09/10/2012 को 15:33
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
45

आप सरणी का विस्तार करने के प्रोटोटाइप का उपयोग कर सकते हैं:

interface Array<T> {
   remove(o: T): Array<T>;
}

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}
09/10/2012 को 16:11
का स्रोत उपयोगकर्ता

वोट
27

declare globalटाइपप्रति 2.1 के रूप में टिकट हो रहा है। ध्यान दें कि Array.prototypeइस प्रकार का है any[], इसलिए यदि आप अपने समारोह कार्यान्वयन स्थिरता के लिए जाँच की करना चाहते हैं, सबसे अच्छा एक सामान्य प्रकार पैरामीटर अपने आप को जोड़ सकते हैं।

declare global {
  interface Array<T> {
    remove(elem: T): Array<T>;
  }
}

if (!Array.prototype.remove) {
  Array.prototype.remove = function<T>(elem: T): T[] {
    return this.filter(e => e !== elem);
  }
}
01/01/2017 को 04:47
का स्रोत उपयोगकर्ता

वोट
6

टाइपप्रति 1.6 से, आप "मूल रूप से" इनबिल्ट प्रकार की तरह मनमाना भाव विस्तार कर सकते हैं।

क्या टाइपप्रति में नया क्या है :

टाइपप्रति 1.6 मनमाने ढंग से अभिव्यक्ति एक निर्माता समारोह की गणना करता है कि विस्तार कक्षाओं के लिए समर्थन जोड़ता है। इसका मतलब यह है कि निर्मित प्रकार अब वर्ग घोषणाओं में बढ़ाया जा सकता है।

एक वर्ग के खंड फैली पहले किसी प्रकार संदर्भ निर्दिष्ट करने की आवश्यकता है। अब यह वैकल्पिक रूप से एक प्रकार तर्क सूची के बाद एक अभिव्यक्ति स्वीकार करता है। अभिव्यक्ति के प्रकार के कम से कम एक निर्माण हस्ताक्षर खंड फैली में निर्दिष्ट प्रकार तर्क की संख्या के रूप में प्रकार पैरामीटर की संख्या समान है के साथ एक निर्माता समारोह प्रकार होना चाहिए। मिलान निर्माण हस्ताक्षर (ओं) की वापसी प्रकार आधार प्रकार जहाँ से वर्ग उदाहरण प्रकार इनहेरिट है। प्रभावी ढंग से, यह दोनों वास्तविक वर्गों और "वर्ग की तरह" भाव निर्दिष्ट करने की धारा फैली में अनुमति देता है।

// Extend built-in types

class MyArray extends Array<number> { }
class MyError extends Error { }

// Extend computed base class

class ThingA {
    getGreeting() { return "Hello from A"; }
}

class ThingB {
    getGreeting() { return "Hello from B"; }
}

interface Greeter {
    getGreeting(): string;
}

interface GreeterConstructor {
    new (): Greeter;
}

function getGreeterBase(): GreeterConstructor {
    return Math.random() >= 0.5 ? ThingA : ThingB;
}

class Test extends getGreeterBase() {
    sayHello() {
        console.log(this.getGreeting());
    }
}
19/10/2015 को 15:03
का स्रोत उपयोगकर्ता

वोट
3
class MyArray<T> extends Array<T> {
    remove: (elem: T) => Array<T> = function(elem: T) {
        return this.filter(e => e !== elem);
    }
}
let myArr = new MyArray<string>();
myArr.remove("some");

इस टाइपप्रति v2.2.1 के साथ मेरे लिए काम करता है!

27/03/2017 को 15:14
का स्रोत उपयोगकर्ता

वोट
2

रिक्की गिब्सन की जवाब देने के लिए जोड़ा जा रहा है,

export{}
declare global {
    interface Array<T> {
        remove(elem: T): Array<T>;
    }
}

if (!Array.prototype.remove) {
  Array.prototype.remove = function<T>(elem: T): T[] {
      return this.filter(e => e !== elem);
  }
}

निर्यात के बिना {} टीएस त्रुटि "वैश्विक विस्तार के लिए augmentations केवल सीधे बाहरी मॉड्यूल या परिवेश मॉड्यूल घोषणाओं में नेस्ट किया जा सकता है।"

28/03/2018 को 11:48
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more