代码之家  ›  专栏  ›  技术社区  ›  Soichi Takamura

流类型是否可以在方法链接中收紧实例的方法定义

  •  2
  • Soichi Takamura  · 技术社区  · 6 年前

    我正在写一个节点。具有流类型的js模块,如下所示。

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

    预期的类型定义为 类似于

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

    但我真的不确定打字是否可行。

    目前,该函数定义为 pipe(fn: (any => any)): Hole . 我想我需要缩小 any 键入函数实际返回的更具体的值。下面是我试图加强实例方法的类型定义的内容,但失败了。

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

    在JavaScript类型工具中是否可能?如果类型脚本可以代替Flow,我将成为一个类型脚本er。我还对Java的流如何解决这个问题感兴趣。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Aleksey L.    6 年前

    在Typescript和Flow中都可能。以下是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)
    

    Typescript Demo

    Flow demo