【问题标题】:A Typed array of functions类型化的函数数组
【发布时间】:2012-09-25 22:12:54
【问题描述】:

我正在努力弄清楚是否可以在 TypeScript 中声明一个静态类型的函数数组。

例如,我可以这样做:

foo: (data:string) => void = function (data) {};

但是如果我希望 foo 成为一个接受字符串但不返回任何内容的函数数组,我该怎么做呢?

foo: (data:string) => void [] = [];

不起作用,因为 TypeScript 认为它是一个接受字符串并返回 void 数组的函数,而且它似乎不喜欢我试图将函数包装在括号中。

有什么想法吗?

答案:感谢下面的 mohamed,下面是一个在 TypeScript Playground 中工作的示例:

class whatever {
public foo: { (data: string): void; }[] = [];

    dofoo() {
        for (var i=0; i < this.foo.length; i++) {
             this.foo[i]("test");
        }
    }
}

var d = new whatever();

d.foo.push(function(bar){alert(bar)})
d.foo.push(function(bar){alert(bar.length.toString())})

d.dofoo();

【问题讨论】:

标签: typescript


【解决方案1】:

您可以在language spec 3.6.4 部分找到它:

foo: { (data: string): void; } []

【讨论】:

  • 是的,似乎做到了。谢谢。
  • @asawyer 必须在类或接口内部,并且末尾必须有分号。
  • @PeterOlson 哦,我明白了。谢谢!
  • 也可以是变量:var foo: { (data: string): void; } [];
  • 语言规范链接已损坏
【解决方案2】:

使用粗箭头键入函数数组的其他(更新、更易读)方法:

let foo: Array<(data: string) => void>;
let bar: ((data: string) => void)[];

【讨论】:

  • 这里的第一个选项是我可以使用 AssemblyScript 的唯一语法。
【解决方案3】:

如果你想在 TypeScript 中声明一个可调用函数数组,你可以声明一个类型:

type Bar = (
  (data: string) => void
);

然后使用它:

const foo: Bar[] = [];

const fooFn = (data: string) => console.log(data);
foo.push(fooFn);
foo.forEach((fooFn: Bar) => fooFn("Something");

【讨论】:

    【解决方案4】:

    foo: ((data: string) =&gt; void)[]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多