En TypeScript, ¿cómo declaro una matriz de funciones que aceptan una cadena y devuelven una cadena?
-
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.
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();