Wie deklariere ich in TypeScript ein Array von Funktionen, die eine Zeichenfolge akzeptieren und eine Zeichenfolge zurückgeben?
-
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.
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();