2012-10-03 20 views
19

UPDATE - kontekstem tego pytania był pre-TypeScript 1.4. Od tej wersji moje pierwsze przypuszczenie zostało poparte językiem. Zobacz aktualizację odpowiedzi.W TypeScript jak zadeklarować tablicę funkcji, które akceptują ciąg znaków i zwracają ciąg znaków?


można zadeklarować f być funkcją, która przyjmuje sznurek i zwraca łańcuch:

var f : (string) => string 

Mogę zadeklarować g być tablicą wyrażenie:

var g : string[] 

Jak mogę zadeklarować, że h jest tablicą "funkcji, która akceptuje ciąg znaków i zwraca ciąg znaków"?

Moje pierwsze przypuszczenie:

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

To wydaje się być błąd składni. Jeśli zabiorę dodatkowe nawiasy, to jest to funkcja od napisu do tablicy ciągów.

Odpowiedz

38

Wymyśliłem to. Problem polega na tym, że => dla literału typu funkcjonalnego jest jedynie cukrem syntaktycznym i nie chce komponować się z [].

jako spec mówi:

typ funkcji dosłownym postaci

(ParamList) => ReturnType

jest dokładnie równoważny typ obiektu dosłownym

{(ParamList): ReturnType}

Więc co chcę jest:

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

Kompletny przykład:

var f : (string) => string 

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

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

h = []; 

h.push(f); 

Aktualizacja:

Sądząc this changeset nawiasach będą mogły w deklaracji typu w 1.4, więc „pierwsze przypuszczenie "w pytaniu będzie również poprawne:

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

Dodatkowa aktualizacja Jest w wersji 1.4!

+3

+1 dobre umiejętności! – Fenton

0

Na podstawie swoich badań napisałem trochę klasa 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(); 
Powiązane problemy