Dactylographiée comment puis-je déclarer un tableau de fonctions qui acceptent une chaîne et renvoie une chaîne?

voix
19

MISE À JOUR - le contexte de cette question a été pré-tapuscrit 1.4. Depuis cette version, ma première estimation a été soutenue par la langue. Voir la mise à jour la réponse.


Je déclare fêtre une fonction qui accepte une chaîne et renvoie une chaîne:

var f : (string) => string

Et je peux déclare gêtre un tableau de chaînes:

var g : string[]

Comment puis - je déclare hêtre un tableau de « fonction qui accepte une chaîne et renvoie une chaîne »?

Ma première hypothèse:

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

Cela semble être une erreur de syntaxe. Si j'enlève les parenthèses supplémentaires, alors il est une fonction de chaîne à tableau de chaînes.

Créé 03/10/2012 à 11:01
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
38

Je compris. Le problème est que l' =>un type de fonction littérale lui - même est simplement le sucre syntaxique et ne veut pas composer avec [].

Comme la spécification dit:

Un type de fonction de la forme littérale

(ParamList) => ReturnType

est exactement équivalent au type d'objet littéral

{(ParamList): ReturnType}

Donc ce que je veux est:

var h : { (s: string): string; }[]

Exemple complet:

var f : (string) => string

f = x => '(' + x + ')';

var h : { (s: string): string; }[]

h = [];

h.push(f);

Mise à jour :

A en juger par cette changeset entre parenthèses seront autorisés dans les déclarations de type à 1.4, la « première estimation » dans la question sera aussi correcte:

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

De plus Mise à jour Il est à 1,4!

Créé 03/10/2012 à 12:00
source utilisateur

voix
0

Sur la base de vos recherches, j'ai écrit une petite classe 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();
Créé 31/03/2014 à 10:19
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more