A máquina de escribir, ¿cómo puedo declarar una matriz de funciones que aceptan una cadena y devolver una cadena?

votos
19

ACTUALIZACIÓN - el contexto de esta pregunta fue pre-mecanografiado 1.4. Desde esa versión, mi primera suposición ha sido apoyado por el lenguaje. Ver la actualización de la respuesta.


Puedo afirmar fque es una función que acepta una cadena y devuelve una cadena:

var f : (string) => string

Y puedo afirmar gser un array de cadenas:

var g : string[]

¿Cómo declaro ha ser un array de función que acepta una cadena y devuelve una cadena?

Mi primera conjetura:

var h : ((string) => string)[]

Eso parece ser un error de sintaxis. Si yo quite los paréntesis adicionales, entonces es una función de cadena para array de cadenas.

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


2 respuestas

votos
38

Me lo imaginé. El problema es que el =>de un tipo literal de la función en sí es simplemente azúcar sintáctica y no quiere componer con [].

A medida que la especificación dice:

Un tipo de función literal de la forma

(Paramlist) => Tipo de retorno

es exactamente equivalente al tipo de objeto literal

{(Paramlist): Tipo de retorno}

Así que lo que quiero es:

var h : { (s: string): string; }[]

Ejemplo completo:

var f : (string) => string

f = x => '(' + x + ')';

var h : { (s: string): string; }[]

h = [];

h.push(f);

actualización :

A juzgar por este conjunto de cambios paréntesis se permitirá en las declaraciones de tipos en el 1,4, por lo que la "primera aproximación" en la pregunta también será correcta:

var h: ((string) => string)[]

Además Modificar Es en 1.4!

Respondida el 03/10/2012 a las 12:00
fuente por usuario

votos
0

Sobre la base de su investigación escribí un poco de clase PlanetGreeter / SayHello: `

/* PlanetGreeter */

class PlanetGreeter {
    hello    : { () : void; } [] = [];
    planet_1 : string = "World";
    planet_2 : string = "Mars";
    planet_3 : string = "Venus";
    planet_4 : string = "Uranus";
    planet_5 : string = "Pluto";
    constructor() {
        this.hello.push( () => { this.greet(this.planet_1); } );
        this.hello.push( () => { this.greet(this.planet_2); } );
        this.hello.push( () => { this.greet(this.planet_3); } );
        this.hello.push( () => { this.greet(this.planet_4); } );
        this.hello.push( () => { this.greet(this.planet_5); } );
    } 
    greet(a: string): void { alert("Hello " + a); }
    greetRandomPlanet():void { 
        this.hello [ Math.floor( 5 * Math.random() ) ] (); 
    } 
} 
new PlanetGreeter().greetRandomPlanet();
Respondida el 31/03/2014 a las 10:19
fuente por usuario

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