Strojopisem, jak mohu prohlásit řadu funkcí, které přijímají řetězce a vrací řetězec?

hlasů
19

UPDATE - kontext této otázky bylo pre-strojopisem 1.4. Od té verzi, můj první odhad byl podpořen jazyka. Podívejte se na aktualizaci na odpověď.


Mohu prohlásit f, že je funkce, která přijímá řetězec a vrátí řetězec:

var f : (string) => string

A mohu prohlásit g, že je pole řetězec:

var g : string[]

Jak mohu prohlásit h, že řada „funkce, která přijímá řetězec a vrátí řetězec“?

Můj první odhad:

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

Která se zdá být syntaktická chyba. Kdybych odnést nadbytečné závorky pak je to funkce z řetězce do pole řetězce.

Položena 03/10/2012 v 11:01
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
38

Přišel jsem na to. Problém je v tom, že =>pro určitý typ funkčního doslovném je sám jen syntaktický cukr a nechce psát s [].

Vzhledem k tomu, spec říká:

Typ funkce doslovný formy

(ParamList) => returnType

je přesně ekvivalentní typu objektu doslovný

{(ParamList): returnType}

Takže to, co chci, je:

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

Kompletní příklad:

var f : (string) => string

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

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

h = [];

h.push(f);

aktualizace :

Soudě podle těchto changesetů závorkách budou moci v prohlášení typu v 1,4, takže „první odhad“ v otázce bude také správné:

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

Dále Aktualizace je v 1.4!

Odpovězeno 03/10/2012 v 12:00
zdroj uživatelem

hlasů
0

na základě výzkumu jsem napsal trochu třída 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();
Odpovězeno 31/03/2014 v 10:19
zdroj uživatelem

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