在 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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 16:11:34  来源:igfitidea点击:

In TypeScript how do I declare an array of functions that accept a string and return a string?

arraysfunctiontypescript

提问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();