Jak mogę opisywanie rekurencyjnych typów w maszynie?

głosy
10

Jeśli mam funkcji takich jak to:

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

ma ciekawą właściwość, że mogę Połączenia łańcuchowe do niego:

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

Kompilator wygeneruje ostrzeżenie, jeśli mijam wiele do pierwszej rozmowy, ale pozwoli mi umieścić numery w kolejnych połączeń.

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

Jaki rodzaj adnotacji muszę dodać do sayfunkcji, aby kompilator generuje ostrzeżenia, kiedy przechodzą w nieprawidłowych typów przykuty do rozmów?

Utwórz 12/10/2012 o 01:14
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
18

Typ, który odwołuje się musi mieć nazwę. Na przykład,

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

następnie można opisywać sayjako OmegaString,

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

następnie następujący kod wpisać-czek.

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

ale dodaje nie będzie,

say("Hello")(1)(2)(3)(4)
Odpowiedział 12/10/2012 o 01:40
źródło użytkownik

głosy
0

metoda Chainable

Kiedy używasz klasę zamiast funkcji można użyć thistypu wyrazić fakt, że metoda zwraca instancję Nazwano na (łańcuchowym metod) .

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

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

funkcja Chainable

Gdy funkcja jest chainable można wpisać go w interfejs:

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

Funkcja Chainable o właściwościach / metod

Jeśli funkcja ma inne właściwości lub metody (np jQuery(str)vs jQuery.data(el)), można wpisać samą funkcję jako interfejs:

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');
Odpowiedział 01/05/2017 o 06:44
źródło użytkownik

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