No TypeScript, como declaro um array de funções que aceita uma string e retorna uma string?
-
13-12-2019 - |
Pergunta
ATUALIZAR - o contexto desta questão era pré-TypeScript 1.4.Desde essa versão, meu primeiro palpite foi apoiado pela linguagem.Veja a atualização da resposta.
eu posso declarar f
para ser uma função que aceita uma string e retorna uma string:
var f : (string) => string
E eu posso declarar g
para ser uma matriz de string:
var g : string[]
Como posso declarar h
ser uma matriz de "função que aceita uma string e retorna uma string"?
Meu primeiro palpite:
var h : ((string) => string)[]
Isso parece ser um erro de sintaxe.Se eu tirar os parênteses extras, será uma função de string para array de string.
Solução
Eu descobri.O problema é que o =>
para um tipo de função literal é apenas um açúcar sintático e não deseja compor com []
.
Como diz a especificação:
Um literal de tipo de função no formato
(ParamList) => ReturnType
é exatamente equivalente ao literal do tipo de objeto
{(ListaParam):Tipoderetorno}
Então o que eu quero é:
var h : { (s: string): string; }[]
Exemplo completo:
var f : (string) => string
f = x => '(' + x + ')';
var h : { (s: string): string; }[]
h = [];
h.push(f);
Atualizar:
A julgar por este conjunto de alterações parênteses serão permitidos nas declarações de tipo em 1.4, então a "primeira suposição" na pergunta também estará correta:
var h: ((string) => string)[]
Atualização adicional Está em 1.4!
Outras dicas
Com base na sua pesquisa, escrevi uma pequena aula 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();