Hvordan kan jeg kommentere rekursive typer i Loggfila?

stemmer
10

Hvis jeg har en funksjon som dette:

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

det har den interessant egenskap som jeg kan kjede samtaler til det:

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

Kompilatoren vil generere en advarsel hvis jeg passerer et tall i den første samtalen, men det vil tillate meg å sette tallene inn i videre samtaler.

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

Hvilken type merknad må jeg legge til sayfunksjonen for å gjøre kompilatoren generere advarsler når jeg passerer ugyldige typer til de lenket samtaler?

Publisert på 12/10/2012 klokken 00:14
kilden bruker
På andre språk...                            


2 svar

stemmer
18

En type som refererer til seg selv må ha et navn. For eksempel,

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

så kan du kommentere saysom OmegaString,

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

deretter følgende kode vil skrive-sjekk.

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

men følgende vil ikke,

say("Hello")(1)(2)(3)(4)
Svarte 12/10/2012 kl. 00:40
kilden bruker

stemmer
0

Chainable metode

Når du bruker en klasse i stedet for en funksjon, kan du bruke den thistypen til å uttrykke det faktum at en metode returnerer eksempel det ble kalt på (kjeding metoder) .

uten 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');

med 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 funksjon

Når en funksjon er chainable kan du skrive det med et grensesnitt:

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

Chainable funksjon med eiendommer / metoder

Hvis en funksjon har andre egenskaper eller metoder (som jQuery(str)vs jQuery.data(el)), kan du skrive selve funksjonen som et grensesnitt:

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');
Svarte 01/05/2017 kl. 06:44
kilden bruker

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