No TypeScript, como declaro um array de funções que aceita uma string e retorna uma string?

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

  •  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.

Foi útil?

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top