2012-10-03 46 views
19

ACTUALIZACIÓN - el contexto de esta pregunta era pre-TypeScript 1.4. Desde esa versión, mi primera conjetura ha sido respaldada por el lenguaje. Ver la actualización de la respuesta.En TypeScript, ¿cómo declaro una matriz de funciones que aceptan una cadena y devuelven una cadena?


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

var f : (string) => string 

Y puedo declarar g a ser un array de cadena:

var g : string[] 

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

Mi primera suposición:

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

Eso parece ser un error de sintaxis. Si elimino los paréntesis adicionales, se trata de una función de cadena a matriz de cadena.

Respuesta

38

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

Como 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): ReturnType}

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 this changeset paréntesis se permitirá en las declaraciones de tipos en el 1,4, por lo que la "primera conjetura "en la pregunta también será correcta:

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

Actualización adicional ¡Está en 1.4!

+3

1 Las buenas habilidades! – Fenton

0

Sobre la base de su investigación que escribió 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(); 
Cuestiones relacionadas