【发布时间】: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.Readable 的MyReadable 类型不兼容。
我已经尝试过:
let stream = transforms.reduce(
(stream: ReadableStream, transform: MyTransform): ReadableStream => (
stream.pipe(transform);
),
inStream
);
因为Readable 实现NodeJS.ReadableStream 和stream.Transform 实现ReadWriteStream 扩展NodeJS.ReadableStream 但是类型脚本说ReadableStream 没有pipe 方法(即使它在打字稿声明中声明对于ReadableStream。
鉴于Transform 和Readable 都实现了管道,打字稿中有没有办法将它们强制在一起?
【问题讨论】:
标签: node.js typescript stream