25

更新- 这个问题的上下文是 TypeScript 1.4 之前的。从那个版本开始,我的第一个猜测就得到了语言的支持。请参阅答案的更新。


我可以声明f为一个接受字符串并返回字符串的函数:

var f : (string) => string

我可以声明g为一个字符串数组:

var g : string[]

如何声明h为“接受字符串并返回字符串的函数”的数组?

我的第一个猜测:

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

这似乎是一个语法错误。如果我去掉多余的括号,那么它就是一个从字符串到字符串数组的函数。

4

2 回答 2

42

我想到了。问题是=>for 函数类型文字本身只是语法糖,不想与[].

正如规范所说:

形式的函数类型文字

( 参数列表 ) => ReturnType

完全等价于对象类型字面量

{ ( 参数列表 ) : 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 中!

于 2012-10-03T11:00:23.407 回答
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();
于 2014-03-31T09:19:54.260 回答