कैसे एक वर्ग टाइपप्रति में एक कॉल हस्ताक्षर को लागू करने के लिए?

वोट
26

मैं टाइपप्रति में निम्नलिखित इंटरफेस को परिभाषित किया है:

interface MyInterface {
    () : string;
}

यह इंटरफ़ेस बस एक फोन हस्ताक्षर है कि कोई पैरामीटर लेता है और एक स्ट्रिंग रिटर्न प्रस्तुत करता है। मैं एक वर्ग में इस प्रकार कैसे लागू करते हैं? मैं निम्नलिखित की कोशिश की है:

class MyType implements MyInterface {
    function () : string {
        return Hello World.;
    }
}

संकलक मुझे उस कह रहता है

क्लास 'MyType' वाणी इंटरफेस 'MyInterface' लेकिन इसे लागू नहीं करता है: प्रकार 'MyInterface' एक कॉल हस्ताक्षर की आवश्यकता है, लेकिन प्रकार 'MyType' एक का अभाव

मैं कॉल हस्ताक्षर कैसे लागू कर सकते हैं?

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


3 जवाब

वोट
11

क्लासेस कि इंटरफ़ेस से मेल नहीं कर सकते हैं। निकटतम आप प्राप्त कर सकते हैं, मुझे लगता है कि इस वर्ग है, जो (संकलक के अनुसार नहीं बल्कि) कोड है कि कार्यात्मक इंटरफ़ेस से मेल खाता है उत्पन्न होगा है।

class MyType implements MyInterface {
  constructor {
    return "Hello";
  }
}
alert(MyType());

इस कोड काम उत्पन्न होगा, लेकिन संकलक कि शिकायत MyTypeहै क्योंकि यह हस्ताक्षर हैं प्रतिदेय नहीं है new() = 'string'(हालांकि अगर आप इसके साथ फोन new, यह एक वस्तु वापस आ जाएगी)।

कुछ है कि actally संकलक शिकायत के बिना इंटरफ़ेस से मेल खाता बनाने के लिए, आप कुछ इस तरह करना होगा:

var MyType = (() : MyInterface => {
  return function() { 
    return "Hello"; 
  }
})();
alert(MyType());
07/10/2012 को 16:32
का स्रोत उपयोगकर्ता

वोट
4

इस जवाब में कोड उदाहरण निम्न घोषणा मान:

var implementation: MyInterface;

एक प्रतिदेय इंटरफ़ेस के एक कार्यान्वयन प्रदान करना

करने के लिए एक अनुवर्ती के रूप में स्वीकार किए जाते हैं जवाब , जैसा कि इसके commentors में से कुछ, एक समारोह से मेल खाता है इंटरफ़ेस की कॉल हस्ताक्षर परोक्ष इंटरफ़ेस लागू करता है ने सुझाव दिया। तो तुम एक कार्यान्वयन के रूप में किसी भी मिलान फ़ंक्शन का उपयोग कर सकते हैं।

उदाहरण के लिए:

implementation = () => "Hello";

आप स्पष्ट रूप से निर्दिष्ट करने के लिए समारोह इंटरफ़ेस लागू करता है कि जरूरत नहीं है। हालांकि, अगर आप स्पष्ट होना चाहता हूँ, आप एक डाली उपयोग कर सकते हैं:

implementation = <MyInterface>() => "Hello";

एक पुन: प्रयोज्य कार्यान्वयन प्रदान करना

आप आप की तरह इंटरफ़ेस का एक पुन: प्रयोज्य कार्यान्वयन का उत्पादन करना चाहते हैं सामान्य रूप से एक जावा या सी # इंटरफेस के साथ, बस समारोह कहीं अपने उपभोक्ताओं के लिए सुलभ संग्रहीत करेंगे।

उदाहरण के लिए:

function Greet() {
    return "Hello";
}

implementation = Greet;

एक parameterised कार्यान्वयन प्रदान करना

आप एक ही तरीका है कि आप एक वर्ग parameterise सकता है में कार्यान्वयन parameterise करने में सक्षम हो सकते हैं। यहाँ एक तरीका यह करना है:

function MakeGreeter(greeting: string) {
    return () => greeting;
}

implementation = MakeGreeter("Hello");

आप परिणाम, इंटरफेस के रूप में लिखा जाता है बस स्पष्ट रूप से वापसी प्रकार सेट या डाली मान दिया जा रहा हैं।

23/12/2013 को 02:45
का स्रोत उपयोगकर्ता

वोट
1

मामले में प्रतिदेय इंटरफ़ेस अन्य तरीकों आप इसे इस तरह से कर सकते हैं करना चाहिए था, तो:

interface Greeter {
    (): void;
    setName(name: string): void;
}

class ConsoleGreeter {

    private constructor( // constructable via `create()`
        private name = 'world'
    ) {}

    public call(): void {
        console.log(`Hello ${this.name}!`);
    }

    public setName(name: string) {
        this.name = name;
    }

    public static create(): Greeter {
        const instance = new ConsoleGreeter();
        return Object.assign(
            () => instance.call(),
            {
                setName: (name: string) => instance.setName(name)
                // ... forward other methods
            }
        );
    }
}

const greeter = ConsoleGreeter.create();
greeter.setName('Dolly');
greeter(); // prints 'Hello Dolly!'

नकारात्मक पक्ष यह है: greeter instanceof ConsoleGreeterहैfalse

25/01/2018 को 08:08
का स्रोत उपयोगकर्ता

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