可以在TypeScript中使用类型化的流吗?

时间:2019-08-06 06:56:16

标签: javascript node.js typescript

在TypeScript中,如果使用键入@types/node,则流仅使用any作为类型。这基本上是可行的,但不是最佳方法,因为通常使用data事件发出的内容总是相同的类型,尤其是在使用带有对象模式的流时。

基本上,如果流使用泛型,则可以以非常简单的方式解决此问题,因此您可以说:

const passThrough = new PassThrough<Customer>({ objectMode: true });

不幸的是,上述类型不支持此操作。我还发现有一个ts-stream软件包,可以很好地解决此问题-但它不能与Node.js流提供100%的兼容性。例如,缺少异步迭代器和destroy函数。

鉴于我不想从头开始创建类型,获取标准Node.js流但强类型的最佳选择是什么?有什么可以做的“把戏”吗?

更笼统地说(哈哈):有没有建立合理的方法来将泛型添加到已经基本使用任何类型的现有类型?

1 个答案:

答案 0 :(得分:0)

只是一个想法,但不适合评论:

From

    type TransformCallback = (error?: Error | null, data?: any) => void;

    interface TransformOptions extends DuplexOptions {
        read?(this: Transform, size: number): void;
        write?(this: Transform, chunk: any, encoding: string, callback: (error?: Error | null) => void): void;
        writev?(this: Transform, chunks: Array<{ chunk: any, encoding: string }>, callback: (error?: Error | null) => void): void;
        final?(this: Transform, callback: (error?: Error | null) => void): void;
        destroy?(this: Transform, error: Error | null, callback: (error: Error | null) => void): void;
        transform?(this: Transform, chunk: any, encoding: string, callback: TransformCallback): void;
        flush?(this: Transform, callback: TransformCallback): void;
    }

    class Transform extends Duplex {
        constructor(opts?: TransformOptions);
        _transform(chunk: any, encoding: string, callback: TransformCallback): void;
        _flush(callback: TransformCallback): void;
    }

    class PassThrough extends Transform { }

只需按照您的规范进行重写-没有示例就很难说出来

    class YourPassThrough<T> extends Duplex {
        constructor(opts?: TransformOptions & { objectMode: true });
        // fit the types
    }

但是大多数情况下,在使用时将any转换成T会更简单

.on('data', (chunk: T) => {
     //if(!validType(chunk, 'T')) throw TypeError;
});