Wie kann ich rekursiv Typen in Typoskript mit Anmerkungen versehen?

stimmen
10

Wenn ich eine Funktion wie folgt aus:

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

es hat die interessante Eigenschaft, dass ich kann Kette Anrufe es:

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

Der Compiler generiert eine Warnung, wenn ich eine Zahl in den ersten Aufruf übergeben, aber es wird mir erlauben, Zahlen in nachfolgende Anrufe zu setzen.

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

Welche Anmerkung muss ich dem hinzufügen sayFunktion der Compiler - Warnungen machen erzeugen , wenn ich in einem ungültigen Typen an die verkettete Anrufe passieren?

Veröffentlicht am 12/10/2012 um 01:14
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
18

Ein Typ, der sich selbst verweist muss einen Namen haben. Beispielsweise,

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

dann können Sie mit Anmerkungen versehen sayals ein OmegaString,

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

dann wird der folgende Code-Überprüfung geben.

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

aber die folgenden werden nicht,

say("Hello")(1)(2)(3)(4)
Beantwortet am 12/10/2012 um 01:40
quelle vom benutzer

stimmen
0

verkettbar Verfahren

Wenn Sie eine Klasse anstelle einer Funktion verwenden, können Sie die Verwendung thisArt zum Ausdruck bringen , dass eine Methode , um die Instanz zurückgibt sie aufgerufen wurde (Verkettungsverfahren) .

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

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

verkettbar Funktion

Wenn eine Funktion verkettbar ist, können Sie es mit einer Schnittstelle eingeben:

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

Verkettbaren Funktion mit Eigenschaften / Methoden

Wenn eine andere Funktion Eigenschaften oder Methoden (wie hat jQuery(str)vs jQuery.data(el)), können Sie die Funktion selbst als Schnittstelle eingeben:

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');
Beantwortet am 01/05/2017 um 06:44
quelle vom benutzer

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