【问题标题】:Using Array.reduce on Node Streams with Typescript在带有 Typescript 的节点流上使用 Array.reduce
【发布时间】:2018-08-27 09:09:24
【问题描述】:

我对 typescript 比较陌生,不熟悉更高级的类型声明。

我正在尝试使用 reduce 将一系列 node.js 流转换链接到传入的 node.js 流上。

传入流是扩展stream.Readable 的对象。流变换对象都扩展stream.Transform

我有一个这些变换对象的数组,我基本上希望最终结果是:

let outStream = inStream.pipe(transform1).pipe(transform2).pipe(transform3)

这在手动管道每个元素时工作正常,但是我无法确定正确的打字稿声明来使用Array.prototype.reduce 实现这一点。

我的代码如下:

class MyReadable extends stream.Readable { ... }
class MyTransform extends stream.Transform { ... }

let inStream = new MyReadable( /* ... */ )

let transforms = [
  new MyTransform( /* ... */ ),
  new MyTransform( /* ... */ ),
  new MyTransform( /* ... */ )
];

let outStream = transforms.reduce(
  (stream: MyReadable, transform: MyTransform): MyReadable => (
    stream.pipe(transform);
  ),
  inStream
);

这会引发打字稿错误,因为.pipe(transform) 返回的MyTransform 类型与扩展stream.ReadableMyReadable 类型不兼容。

我已经尝试过:

let stream = transforms.reduce(
  (stream: ReadableStream, transform: MyTransform): ReadableStream => (
    stream.pipe(transform);
  ),
  inStream
);

因为Readable 实现NodeJS.ReadableStreamstream.Transform 实现ReadWriteStream 扩展NodeJS.ReadableStream 但是类型脚本说ReadableStream 没有pipe 方法(即使它在打字稿声明中声明对于ReadableStream

鉴于TransformReadable 都实现了管道,打字稿中有没有办法将它们强制在一起?

【问题讨论】:

    标签: node.js typescript stream


    【解决方案1】:

    发布后我意识到有一种更简单的方法可以实现我的目标。

    鉴于原始解决方案在功能上可行,我仍然会对这个关于如何组合这两种 Typescript 类型的特定问题的答案感兴趣。

    我的解决方案:

    class MyReadable extends stream.Readable { ... }
    class MyTransform extends stream.Transform { ... }
    
    let inStream = new MyReadable( /* ... */ )
    
    let transforms = [
      new MyTransform( /* ... */ ),
      new MyTransform( /* ... */ ),
      new MyTransform( /* ... */ )
    ];
    
    let outStream = inStream.pipe(transforms.reduce(
      (stream: MyTransform, transform: MyTransform): MyTransform => (
        stream.pipe(transform);
      ),
      transforms[0]
    ));
    

    【讨论】:

    • 作为一个快速建议,您不必指定所有类型,您可以依赖 TS 的推理。此外,reduce 已经采用了没有初始值的数组的第一个元素:inStream.pipe(transforms.reduce((acc, transform) => acc.pipe(transform)));
    • 谢谢@Gustorn,我忘了reduce默认设置累加器。
    猜你喜欢
    • 2019-10-19
    • 1970-01-01
    • 2017-06-19
    • 2018-09-09
    • 2014-07-09
    • 2014-06-26
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多