在 TypeScript 中,如何声明一个接受字符串并返回字符串的函数数组?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12706161/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
In TypeScript how do I declare an array of functions that accept a string and return a string?
提问by Daniel Earwicker
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.
更新- 这个问题的上下文是 TypeScript 1.4 之前的。从那个版本开始,我的第一个猜测就得到了该语言的支持。请参阅答案的更新。
I can declare fto be a function that accepts a string and returns a string:
我可以声明f为一个接受字符串并返回字符串的函数:
var f : (string) => string
And I can declare gto be an array of string:
我可以声明g为一个字符串数组:
var g : string[]
How can I declare hto be an array of "function that accepts a string and returns a string"?
如何声明h为“接受字符串并返回字符串的函数”的数组?
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.
这似乎是一个语法错误。如果我去掉额外的括号,那么它就是一个从字符串到字符串数组的函数。
回答by Daniel Earwicker
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 [].
我想到了。问题是=>for 函数类型文字本身只是语法糖,不想与[].
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 changesetparentheses will be allowed in type declarations in 1.4, so the "first guess" in the question will also be correct:
从这个变更集来看,1.4 中的类型声明中将允许使用括号,因此问题中的“第一次猜测”也将是正确的:
var h: ((string) => string)[]
Further UpdateIt is in 1.4!
进一步更新它在 1.4 中!
回答by user37057
Based on your research I wrote a little class PlanetGreeter/SayHello:`
根据你的研究,我写了一个小类 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();

