वहाँ एक वर्ग टाइपप्रति उपयोग करने के लिए मक्खी पर विधियों को जोड़ने के लिए एक रास्ता है?

वोट
17

मुझे लगता है कि मक्खी पर प्रोटोटाइप / वर्ग के लिए तरीके जोड़ mixin विधि किसी तरह का बनाने के कोशिश कर रहा हूँ, लेकिन मैं इस तरह के रूप में त्रुटियाँ मिलता है

संपत्ति 'greetName' प्रकार का मान 'स्वागतकर्ता' किसी भी पर मौजूद नहीं है

तथा

संपत्ति 'greetName' प्रकार का मान 'स्वागतकर्ता' किसी भी पर मौजूद नहीं है

जब मैं निम्नलिखित कोड चलाते हैं।

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return Hello,  + this.greeting;
    }
}

Greeter.prototype.greetName = function(name){
        return this.greet() + ' ' + name;
}

var greeter = new Greeter('Mr');

window.alert(greeter.greetName('Name'));

अपेक्षा के अनुरूप यह वास्तव में वैध जे एस और रन के लिए संकलित करता है। वहाँ संकलक चेतावनी / त्रुटियों के साथ यह करने के लिए कोई तरीका है?

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


6 जवाब

वोट
15

यह समाधान आप की जाँच जब आप गतिशील रूप से एक विधि जोड़ने टाइप देने को लाभ मिलता है:

class MyClass {
    start() {

    }
}
var example = new MyClass();
// example.stop(); not allowed


interface MyClass {
  stop(): void;
}

MyClass.prototype['stop'] = function () {
    alert('Stop');
}
var stage2 = example;
stage2.stop();
06/06/2013 को 17:02
का स्रोत उपयोगकर्ता

वोट
8

एक और तरीका यह करने के लिए नहीं है।

Greeter["SomeProperty"] = function() {
     return "somevalue";
};

एक ही काम करता है और जावास्क्रिप्ट में संपत्ति इंडेक्सर फ़ंक्शन का उपयोग करता है और टाइपप्रति शिकायत नहीं है।

19/12/2012 को 16:06
का स्रोत उपयोगकर्ता

वोट
8

वे काम करने के लिए इस के लिए आंशिक वर्ग है जो अभी समर्थित नहीं है की एक अवधारणा की आवश्यकता होगी। मैं आपको बता देंगे कि क्या मैंने पाया स्थितियों के इन प्रकार के लिए बेहतर काम करता बजाय इंटरफेस का उपयोग करने के लिए है (अब के बारे में 6 महीने के लिए मैं टाइपप्रति में प्रोग्रामिंग किया गया है - मैं एमएस में हूँ लेकिन टाइपप्रति टीम पर नहीं)

इंटरफेस बस तरीकों आप इंटरफ़ेस करने के लिए जोड़ रहे हैं definging द्वारा इस तथ्य के बाद विस्तृत कर रहे हैं। इस का एक उदाहरण के रूप में, यदि आप एक jQuery प्लगइन स्थापित आप IJQuery और IJQueryUtil इंटरफ़ेस फिर से परिभाषित करने प्लगइन्स अतिरिक्त तरीकों में शामिल करना चाहते हैं। उस बिंदु से आगे आप $ .plugin () और टाइपप्रति के माध्यम से प्लगइन्स विधियां प्रारंभ खुश हो जाएगा कर सकते हैं।

02/10/2012 को 23:22
का स्रोत उपयोगकर्ता

वोट
1

उदाहरण @Fenton के लिए, लेकिन ऐंठा हुआ सामान के बिना समान:

class MyClass {
    start() {
    }
}
MyClass.prototype['stop'] = function () {
    alert('Stop');
}

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
26/05/2018 को 14:16
का स्रोत उपयोगकर्ता

वोट
0

यह कैसे है RxJSयह करता है

import {Observable} from "./observable"; // which is Greeter in your case 


declare module "./observable" {
    interface Observable<T> {
        map<U>(f: (x: T) => U): Observable<U>;
    }
}

Observable.prototype.map = function (f) {

}

इस मॉड्यूल विस्तार कहा जाता है।

23/10/2018 को 00:21
का स्रोत उपयोगकर्ता

वोट
0

वर्गों पर गतिशील तरीकों और गुण को लागू करने के बाद, इस समाधान मैं शिकायत से टाइपप्रति संकलक को रोकने के लिए साथ जाने के लिए कर रहा था था:

...
window.alert(greeter['greetName']('Name'));

मूल रूप से, के ब्रैकेट विधि का उपयोग संपत्ति accessors

26/08/2016 को 01:56
का स्रोत उपयोगकर्ता

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