在使用Typescript

时间:2018-03-18 19:58:42

标签: node.js typescript stream

我对打字稿很新,不熟悉更高级的类型声明。

我试图使用reduce将一系列node.js流转换为链接到传入的node.js流。

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

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

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

这在手动管道每个元素时工作正常,但我无法使用Array.prototype.reduce确定正确的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 = transforms.reduce(
  (stream: MyReadable, transform: MyTransform): MyReadable => (
    stream.pipe(transform);
  ),
  inStream
);

这会引发打字稿错误,因为.pipe(transform)会返回MyTransform类型,该类型与扩展MyReadable的{​​{1}}类型不兼容。

我尝试过:

stream.Readable

因为let stream = transforms.reduce( (stream: ReadableStream, transform: MyTransform): ReadableStream => ( stream.pipe(transform); ), inStream ); 实现ReadableNodeJS.ReadableStream实现stream.Transform扩展ReadWriteStream但是类型脚本说NodeJS.ReadableStream没有ReadableStream方法(即使它在pipe的typescript声明中声明。

鉴于ReadableStreamTransform都实现了管道,有什么方法可以将打字稿一起强制解决这些问题吗?

1 个答案:

答案 0 :(得分:0)

我在发帖后意识到有一种更简单的方法来实现我的目标。

我仍然感兴趣的是,对于这个特定问题是否有一个答案,关于如何组合这两种打字稿类型,只要在功能上原始解决方案可行。

我的解决方案:

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]
));