Cum pot adnota tipuri de recursive dactilografiat?

voturi
10

Dacă am o funcție de genul:

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

are proprietatea interesantă pe care le pot apeluri în lanț pentru ea:

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

Compilatorul va genera un avertisment, dacă am trece un număr în primul apel, dar îmi va permite să pună numere în apelurile ulterioare.

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

Ce tip de adnotare am nevoie pentru a adăuga la sayfuncția de a face compilator genera avertismente atunci când trec în tipuri invalide la apelurile înlănțuite?

Întrebat 12/10/2012 la 01:14
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
18

Un tip care se face referire trebuie să aibă un nume. De exemplu,

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

atunci puteți adnota sayca OmegaString,

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

apoi următorul cod va tip de verificare.

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

dar următoarele nu vor,

say("Hello")(1)(2)(3)(4)
Publicat 12/10/2012 la 01:40
sursa de către utilizator

voturi
0

metoda Chainable

Când utilizați o clasă în locul unei funcții, puteți utiliza thistipul pentru a exprima faptul că o metodă returnează instanță a fost numit pe (înlănțuire metode) .

Fără 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');

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

funcţia Chainable

Atunci când o funcție este chainable îl puteți introduce cu o interfață:

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

Funcția Chainable cu proprietăți / metode

Dacă o funcție are alte proprietăți sau metode (cum ar fi jQuery(str)vs jQuery.data(el)), puteți introduce funcția în sine ca o interfață:

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');
Publicat 01/05/2017 la 06:44
sursa de către utilizator

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