Подтвердить что ты не робот

В TypeScript как объявить массив функций, которые принимают строку и возвращают строку?

UPDATE - контекст этого вопроса был до TypeScript 1.4. Начиная с этой версии, мое первое предположение было поддержано языком. См. Обновление для ответа.


Я могу объявить f как функцию, которая принимает строку и возвращает строку:

var f : (string) => string

И я могу объявить g как массив строки:

var g : string[]

Как я могу объявить h как "массив", который принимает строку и возвращает строку??

Мое первое предположение:

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

Кажется, это синтаксическая ошибка. Если я заберу дополнительные скобки, то это функция из строки в массив строки.

4b9b3361

Ответ 1

Я понял это. Проблема в том, что => для литерала типа функции сам по себе является просто синтаксическим сахаром и не хочет составлять с помощью [].

Как говорится в спецификации:

Литер типа функции формы

(ParamList) = > ReturnType

в точности эквивалентен литералу типа объекта

{(ParamList): ReturnType}

Итак, я хочу:

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

Полный пример:

var f : (string) => string

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

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

h = [];

h.push(f);

Обновление

Судя по этой скобке в квадратных скобках, будут разрешены в объявлениях типов в 1.4, поэтому "первая догадка" в вопросе также будет правильной:

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

Дальнейшее обновление. Это в 1.4!

Ответ 2

Основываясь на ваших исследованиях, я написал небольшой класс 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();