我对打字稿很新,不熟悉更高级的类型声明。
我试图使用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
);
实现Readable
而NodeJS.ReadableStream
实现stream.Transform
扩展ReadWriteStream
但是类型脚本说NodeJS.ReadableStream
没有ReadableStream
方法(即使它在pipe
的typescript声明中声明。
鉴于ReadableStream
和Transform
都实现了管道,有什么方法可以将打字稿一起强制解决这些问题吗?
答案 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]
));