Hogyan jegyzetekkel rekurzív típusú géppel?

szavazat
10

Ha van egy funkciója, mint ez:

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

azt az érdekes tulajdonsága, hogy tudok-lánc hívásokat is:

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

A fordító figyelmeztetést generál, ha átmegyek egy számot az első hívást, de lehetővé teszi, hogy tegye számokat későbbi hívások.

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

Milyen típusú kommentár kell tennem, hogy adjunk a sayfunkciót, hogy a fordító generál figyelmeztetéseket átadom érvénytelen típusok A láncolt hívások?

A kérdést 12/10/2012 01:14
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
18

A típus, amely hivatkozik kell rendelkeznie egy nevet. Például,

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

akkor jegyzetekkel say, mint egy OmegaString,

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

akkor a következő kód írja ellenőrzést.

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

de a következő nem fog,

say("Hello")(1)(2)(3)(4)
Válaszolt 12/10/2012 01:40
a forrás felhasználó

szavazat
0

Chainable módszer

Ha ön használ egy osztály helyett egy funkciót, akkor a thistípus, hogy kifejezze azt a tényt, hogy a módszer visszaadja a példány hívták fel (metódusok) .

Anélkül 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');

a 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 funkció

Ha egy függvény chainable beírhatja azt interfész:

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

Chainable funkció tulajdonságokkal / módszerek

Ha egy függvény más tulajdonságokkal vagy módszerek (pl jQuery(str)vs jQuery.data(el)), akkor írja a funkciót is, mint egy interfész:

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');
Válaszolt 01/05/2017 06:44
a forrás felhasználó

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