¿Cómo puedo realizar anotaciones tipos recursivos a máquina de escribir?

votos
10

Si tengo una función como esta:

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

que tiene la propiedad interesante que las llamadas cadena puede a ella:

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

El compilador generará una advertencia si paso un número en la primera llamada, pero permitirá que ponga números en las llamadas posteriores.

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

¿Qué tipo de anotación Qué necesito para añadir a la sayposibilidad de efectuar el compilador genera advertencias cuando paso en los tipos válidos para las llamadas encadenadas?

Publicado el 12/10/2012 a las 01:14
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
18

Un tipo que hace referencia a sí mismo debe tener un nombre. Por ejemplo,

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

entonces se puede anotar saycomo OmegaString,

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

a continuación, el siguiente código de tipo-check.

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

pero el siguiente no lo hará,

say("Hello")(1)(2)(3)(4)
Respondida el 12/10/2012 a las 01:40
fuente por usuario

votos
0

método chainable

Cuando está utilizando una clase en lugar de una función, se puede utilizar el thistipo de expresar el hecho de que un método devuelve la instancia que se llamaba en (métodos de encadenamiento) .

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

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

función chainable

Cuando una función es chainable puede escribir con una interfaz:

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

función de cadena con propiedades / métodos

Si una función tiene otras propiedades o métodos (como jQuery(str)vs jQuery.data(el)), puede escribir la función como una interfaz:

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');
Respondida el 01/05/2017 a las 03:44
fuente por usuario

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