कैसे प्रोटोटाइप टाइपप्रति पर विस्तार करता है?

वोट
15

मैं समारोह प्रोटोटाइप बढ़ाया लेकिन टाइपप्रति में मान्यता नहीं देता।

Function.prototype.proc = function() {
  var args, target, v;
  var __slice = [].slice;
  args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
  target = this;
  while (v = args.shift()) {
    target = target(v);
  }
  return target;
};
// generated by coffee-script

var foo: (number) => (string) => number
  = (a) => (b) => a * b.length;
console.log(foo.proc(first, second))

परिणाम: tsc -e

The property 'proc' does not exist on value of type 'Function'

मैं कैसे इस वस्तु का विस्तार करते हैं?

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


4 जवाब

वोट
33

वहाँ मानक टाइपप्रति lib जो समारोह वस्तुओं के सदस्यों की घोषणा में एक समारोह इंटरफेस है। आप अपनी खुद की साथ कि इंटरफ़ेस के सदस्य के रूप proc घोषित निम्नलिखित की तरह पर जोड़ने की आवश्यकता होगी:

interface Function {
    proc(...args: any[]): any;
}

इस इंटरफ़ेस से कहीं भी आप 'proc' का उपयोग करना चाहते संदर्भित किया जा करने की आवश्यकता होगी।

07/10/2012 को 19:03
का स्रोत उपयोगकर्ता

वोट
6

इस कदर:

declare global {
    interface Function {
        proc() : any;
    }
}

बिना 'घोषित वैश्विक' यह काम नहीं करता।

यही कारण है कि कैसे मॉड्यूल वृद्धि हाल टाइपप्रति संस्करणों में काम करता है। की जाँच करें प्रलेखन और के लिए नीचे स्क्रॉल Module augmentationअनुभाग।

25/06/2016 को 05:00
का स्रोत उपयोगकर्ता

वोट
0

बस जोड़ने है कि अगर आप कुछ है कि पहले से ही घोषित की गई परिभाषित जोड़ने की कोशिश कर रहे हैं, तो यह ऐसा करने का typesafe रास्ता है, वह भी गाड़ी के खिलाफ की रक्षा करता है for inकार्यान्वयन।

export const augment = <U extends (string|symbol), T extends {[key :string] :any}>(
    type  :new (...args :any[]) => T,
    name  :U,
    value :U extends string ? T[U] : any
) => {
    Object.defineProperty(type.prototype, name, {writable:true, enumerable:false, value});
};

जो सुरक्षित रूप से polyfill के लिए इस्तेमाल किया जा सकता है। उदाहरण

//IE doesn't have NodeList.forEach()
if (!NodeList.prototype.forEach) {
    //this errors, we forgot about index & thisArg!
    const broken = function(this :NodeList, func :(node :Node, list :NodeList) => void) {
        for (const node of this) {
            func(node, this);
        }
    };
    augment(NodeList, 'forEach', broken);

    //better!
    const fixed = function(this :NodeList, func :(node :Node, index :number, list :NodeList) => void, thisArg :any) {
        let index = 0;
        for (const node of this) {
            func.call(thisArg, node, index++, this);
        }
    };
    augment(NodeList, 'forEach', fixed);
}

दुर्भाग्य से यह एक की वजह से अपने प्रतीकों typecheck नहीं कर सकते वर्तमान टीएस में सीमा , और यह आप पर चिल्लाना नहीं होगा यदि स्ट्रिंग किसी भी परिभाषा से मेल नहीं खाता किसी कारण से, अगर वे पहले से कर रहे हैं मैं देखने के बाद बग रिपोर्ट करेंगे ध्यान रखें।

26/03/2019 को 02:25
का स्रोत उपयोगकर्ता

वोट
0

मैं इस उदाहरण सवाल में दिखाया गया है के बाद से बहुत से लोगों को यह प्रश्न देखने की तरह प्रोटोटाइप जोड़ने के खिलाफ सलाह को जोड़ने कर रहा हूँ। इस प्रकार यह करें:

interface Function {
    proc(...args: any[]): any;
}

Object.defineProperty(Function.prototype, 'proc', { value: function(arg: any[]) {
    // Your function body
}});

कारण यदि आप सीधे प्रोटोटाइप में जोड़ने, यह प्रगणित हो सकता है अगर यह है कि समारोह प्राप्त खत्म हो चुका है प्रगणित का एक उदाहरण। for i in ..। अब इस ब्लॉक एक कोड आप नियंत्रित नहीं करते (हाल ही में मुझे क्या हुआ) में हो सकता है, तो यह आपके कोड संभव के रूप में सुरक्षित रखने के लिए सबसे अच्छा है।

02/05/2017 को 22:52
का स्रोत उपयोगकर्ता

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