2 votes

Le type de flux peut-il resserrer la définition de la méthode d'une instance dans le cadre d'un chaînage de méthodes ?

J'écris un module Node.js avec un typage Flow qui ressemble à ceci.

hole(obj)
    .pipe(fn1)
    .pipe(fn2)
    .pipe(fn3);

Et la définition du type attendu est quelque chose comme ceci.

/* Not working */
hole(T)
    .pipe((T) => U)
    .pipe((U) => V)
    .pipe((V) => W)

Mais je ne suis pas sûr que la dactylographie soit possible.

Actuellement, la fonction est définie comme suit pipe(fn: (any => any)): Hole . Je pense qu'il faut que je réduise le nombre de any pour être plus précis que ce que les fonctions renvoient réellement. Voici ce que j'ai essayé de faire pour resserrer la définition du type de la méthode de l'instance, mais j'ai échoué.

/* Not working */
class Hole {
    pipe(fn: (T => U)): (Hole & {pipe: (U => V)}))
}

Est-ce possible avec des outils de type JavaScript ? Si Type script peut remplacer Flow, je deviendrai un Type script-er. Je suis également intéressé par la façon dont le Stream de Java résout ce problème.

4voto

Tao Points 1383

Possible à la fois en Typescript et en Flow. Voici une version TypeScript :

declare class Hole<T> {
    constructor(p: T);
    pipe<R>(fn: (p: T) => R): Hole<R>;
}

new Hole(42)
    .pipe(p => p.toString())
    .pipe(p => parseInt(p))
    .pipe(p => [p])
    .pipe(p => p.length)

Démonstration de Typescript%3A%20Hole%3CR%3E%3B%0D%0A%7D%0D%0A%0D%0Anew%20Hole(42)%0D%0A%20%20%20%20.pipe(p%20%3D%3E%20p.toString())%0D%0A%20%20%20%20.pipe(p%20%3D%3E%20parseInt(p))%0D%0A%20%20%20%20.pipe(p%20%3D%3E%20%5Bp%5D)%0D%0A%20%20%20%20.pipe(p%20%3D%3E%20p.length))

Démonstration de flux

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