मैं पुनरावर्ती प्रकार कैसे टिप्पणी कर सकते हैं टाइपप्रति में?

वोट
10

अगर मैं इस तरह एक समारोह है:

function say(message: string) {
    alert(message);
    return say;
}

यह दिलचस्प संपत्ति है कि मैं यह करने के लिए श्रृंखला कॉल कर सकते हैं:

say(Hello,)(how)(are)(you?);

अगर मैं पहली कॉल में एक नंबर पारित संकलक एक चेतावनी उत्पन्न होगा, लेकिन यह मुझे आगामी कॉल में संख्या डाल करने के लिए अनुमति देगा।

say(Hello)(1)(2)(3)(4)

किस तरह के एनोटेशन मैं करने के लिए जोड़ने की जरूरत है sayसंकलक चेतावनी उत्पन्न जब मैं श्रृंखलित कॉल करने के लिए अवैध प्रकार में पारित करने के लिए समारोह?

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


2 जवाब

वोट
18

एक प्रकार खुद का संदर्भ देता है एक नाम होना चाहिए। उदाहरण के लिए,

interface OmegaString {
    (message: string): OmegaString;
}

तो आप टिप्पणी कर सकते हैं sayएक के रूप में OmegaString,

function say(message: string): OmegaString {
    alert(message);
    return say;
}

उसके बाद निम्न कोड टाइप की जांच करेंगे।

say("Hello,")("how")("are")("you?");

लेकिन निम्न, नहीं होगा

say("Hello")(1)(2)(3)(4)
12/10/2012 को 01:40
का स्रोत उपयोगकर्ता

वोट
0

chainable विधि

आप एक समारोह के बजाय एक वर्ग का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं thisतथ्य यह है कि एक विधि उदाहरण उस पर बुलाया गया था रिटर्न को व्यक्त करने के प्रकार (चेनिंग विधि)

बिना this:

class StatusLogger {
    log(message: string): StatusLogger { ... }
}
// this works
new ErrorLogger().log('oh no!').log('something broke!').log(':-(');

class PrettyLogger extends StatusLogger {
    color(color: string): PrettyLogger { ... }
}
// this works
new PrettyLogger().color('green').log('status: ').log('ok');
// this does not!
new PrettyLogger().log('status: ').color('red').log('failed');

साथ this:

class StatusLogger {
    log(message: string): this { ... }
}
class PrettyLogger extends StatusLogger {
    color(color: string): this { ... }
}
// this works now!
new PrettyLogger().log('status:').color('green').log('works').log('yay');

chainable समारोह

जब एक समारोह chainable है आप एक इंटरफेस के साथ यह लिख सकते हैं:

function say(text: string): ChainableType { ... }
interface ChainableType {
    (text: string): ChainableType;
}
say('Hello')('World');

गुण / तरीकों के साथ chainable समारोह

एक समारोह के अन्य संपत्तियों या तरीकों नहीं हैं (जैसे jQuery(str)बनाम jQuery.data(el)), तो आपको एक अंतरफलक के रूप समारोह में ही लिख सकते हैं:

interface SayWithVolume {
    (message: string): this;
    loud(): this;
    quiet(): this;
}

const say: SayWithVolume = ((message: string) => { ... }) as SayWithVolume;
say.loud = () => { ... };
say.quiet = () => { ... };

say('hello').quiet()('can you hear me?').loud()('hello from the other side');
01/05/2017 को 06:44
का स्रोत उपयोगकर्ता

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