在 TypeScript 中,如何声明一个接受字符串并返回字符串的函数数组?

Posted

技术标签:

【中文标题】在 TypeScript 中,如何声明一个接受字符串并返回字符串的函数数组?【英文标题】:In TypeScript how do I declare an array of functions that accept a string and return a string? 【发布时间】:2012-09-24 05:50:29 【问题描述】:

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


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

var f : (string) => string

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

var g : string[]

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

我的第一个猜测:

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

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

【问题讨论】:

【参考方案1】:

我想通了。问题是函数类型文字的=> 本身只是语法糖,不想与[] 组合。

正如规范所说:

形式为

的函数类型字面量

( 参数列表 ) => 返回类型

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

( 参数列表 ) : ReturnType

所以我想要的是:

var h :  (s: string): string; []

完整示例:

var f : (string) => string

f = x => '(' + x + ')';

var h :  (s: string): string; []

h = [];

h.push(f);

更新

从this changeset来看,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();

【讨论】:

以上是关于在 TypeScript 中,如何声明一个接受字符串并返回字符串的函数数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何键入 Typescript 数组以仅接受一组特定的值?

在 Typescript 中,如何声明一个返回字符串类型数组的函数?

如何定义 Typescript 部分类型以仅接受属性

具有多种类型的函数声明

如何仅使用 TypeScript 声明其属性为字符串类型的对象?

如何在 TypeScript 界面中要求特定的字符串