En TypeScript, ¿cómo declaro una matriz de funciones que aceptan una cadena y devuelven una cadena?

StackOverflow https://stackoverflow.com//questions/12706161

  •  13-12-2019
  •  | 
  •  

Pregunta

ACTUALIZAR - el contexto de esta pregunta era anterior a TypeScript 1.4.Desde esa versión, mi primera suposición ha sido respaldada por el idioma.Vea la actualización de la respuesta.


puedo declarar f ser una función que acepta una cadena y devuelve una cadena:

var f : (string) => string

Y puedo declarar g ser una matriz de cadena:

var g : string[]

¿Cómo puedo declarar? h ¿Ser una matriz de "función que acepta una cadena y devuelve una cadena"?

Mi primera suposición:

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

Parece ser un error de sintaxis.Si quito los paréntesis adicionales, entonces es una función de una cadena a una matriz de cadenas.

¿Fue útil?

Solución

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

Como dice la especificación:

Un tipo de función literal de la forma

( ListaParam ) => Tipo de retorno

es exactamente equivalente al tipo de objeto literal

{ (ListaParam):Tipo de retorno }

Entonces 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);

Actualizar:

A juzgar por este conjunto de cambios Se permitirán paréntesis en las declaraciones de tipo en 1.4, por lo que la "primera suposición" en la pregunta también será correcta:

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

Actualización adicional ¡Está en 1.4!

Otros consejos

Basado en tu investigación, escribí una pequeña 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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top