In TypeScript how do I declare an array of functions that accept a string and return a string?

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

  •  13-12-2019
  •  | 
  •  

Question

UPDATE - the context of this question was pre-TypeScript 1.4. Since that version, my first guess has been supported by the language. See the update to the answer.


I can declare f to be a function that accepts a string and returns a string:

var f : (string) => string

And I can declare g to be an array of string:

var g : string[]

How can I declare h to be an array of "function that accepts a string and returns a string"?

My first guess:

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

That seems to be a syntax error. If I take away the extra parentheses then it's a function from string to array of string.

Was it helpful?

Solution

I figured it out. The problem is that the => for a function type literal is itself merely syntactic sugar and doesn't want to compose with [].

As the spec says:

A function type literal of the form

( ParamList ) => ReturnType

is exactly equivalent to the object type literal

{ ( ParamList ) : ReturnType }

So what I want is:

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

Complete example:

var f : (string) => string

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

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

h = [];

h.push(f);

Update:

Judging from this changeset parentheses will be allowed in type declarations in 1.4, so the "first guess" in the question will also be correct:

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

Further Update It is in 1.4!

OTHER TIPS

Based on your research I wrote a little class 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();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top