Wie deklariere ich in TypeScript ein Array von Funktionen, die eine Zeichenfolge akzeptieren und eine Zeichenfolge zurückgeben?

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

  •  13-12-2019
  •  | 
  •  

Frage

AKTUALISIEREN - Der Kontext dieser Frage war vor TypeScript 1.4.Seit dieser Version wird meine erste Vermutung von der Sprache unterstützt.Sehen Sie sich das Update zur Antwort an.


Ich kann es erklären f eine Funktion sein, die einen String akzeptiert und einen String zurückgibt:

var f : (string) => string

Und ich kann es erklären g ein String-Array sein:

var g : string[]

Wie kann ich erklären h ein Array von „Funktion, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt“ sein?

Meine erste Vermutung:

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

Das scheint ein Syntaxfehler zu sein.Wenn ich die zusätzlichen Klammern wegnehme, handelt es sich um eine Funktion vom String zum String-Array.

War es hilfreich?

Lösung

Ich habe es herausgefunden.Das Problem ist, dass die => denn ein Funktionstypliteral ist selbst lediglich syntaktischer Zucker und möchte nicht mit komponieren [].

Wie die Spezifikation sagt:

Ein Funktionstypliteral des Formulars

( ParamList ) => ReturnType

entspricht genau dem Objekttypliteral

{ (ParamList) :ReturnType }

Was ich also möchte ist:

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

Vollständiges Beispiel:

var f : (string) => string

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

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

h = [];

h.push(f);

Aktualisieren:

Gemessen an dieser Änderungssatz Klammern sind in Typdeklarationen in 1.4 zulässig, daher ist auch die „erste Vermutung“ in der Frage richtig:

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

Weiteres Update Es ist in 1.4!

Andere Tipps

Basierend auf Ihrer Recherche habe ich einen kleinen Kurs „PlanetGreeter/SayHello:`“ geschrieben

/* 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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top