84 votes

Un tableau de fonctions typées

J'ai du mal à comprendre s'il est possible en TypeScript de déclarer un tableau de fonctions typées statiquement.

Par exemple, je peux faire ceci :

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

Mais si je veux que foo soit un tableau de fonctions qui prennent une chaîne et ne renvoient rien, comment faire ?

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

Cela ne fonctionne pas parce que TypeScript pense qu'il s'agit d'une fonction qui prend une chaîne et renvoie un tableau de void, et il ne semble pas apprécier que j'essaie d'envelopper la fonction dans des parenthèses.

Des idées ?

Respuesta : Grâce à mohamed ci-dessous, voici un exemple qui fonctionne dans le 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();

114voto

mohamed hegazy Points 2294

Vous pouvez le trouver dans la rubrique spécification linguistique section 3.6.4 :

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

74voto

Saravana Points 14313

Il existe d'autres façons (plus récentes et plus lisibles) de saisir un tableau de fonctions à l'aide de grosses flèches :

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

12voto

aaron Points 195

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

6voto

Janderson Silva Points 1287

Si vous souhaitez déclarer un tableau de fonctions appelables en TypeScript, vous pouvez déclarer un type :

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

Et ensuite, utilisez-le :

const foo: Bar[] = [];

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X