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

голоса
19

UPDATE - контекст этого вопроса был предварительно машинопись 1,4. С этой версии, моя первая догадка была поддержана языка. Смотрите обновление в ответ.


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

var f : (string) => string

И я могу заявить g, что массив строки:

var g : string[]

Как я могу заявить h, что массив «функция , которая принимает строку и возвращает строку»?

Моя первая догадка:

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

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

Задан 03/10/2012 в 11:01
источник пользователем
На других языках...                            


2 ответов

голоса
38

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

Как спецификации сказано:

Тип функции буквальным вида

(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!

Ответил 03/10/2012 в 12:00
источник пользователем

голоса
0

Основываясь на своих исследованиях я написал немного класс 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();
Ответил 31/03/2014 в 10:19
источник пользователем

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