В TypeScript как объявить массив функций, которые принимают строку и возвращают строку?
UPDATE - контекст этого вопроса был до TypeScript 1.4. Начиная с этой версии, мое первое предположение было поддержано языком. См. Обновление для ответа.
Я могу объявить f
как функцию, которая принимает строку и возвращает строку:
var f : (string) => string
И я могу объявить g
как массив строки:
var g : string[]
Как я могу объявить h
как "массив", который принимает строку и возвращает строку??
Мое первое предположение:
var h : ((string) => string)[]
Кажется, это синтаксическая ошибка. Если я заберу дополнительные скобки, то это функция из строки в массив строки.
Ответы
Ответ 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();