【问题标题】:Is it possible to use typed streams in TypeScript?是否可以在 TypeScript 中使用类型化流?
【发布时间】:2019-12-13 16:19:59
【问题描述】:

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

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

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

不幸的是,上述类型不支持这一点。我还发现有 ts-stream 包,它很好地解决了这个问题——但它不能 100% 兼容 Node.js 流。例如,缺少异步迭代器和 destroy 函数。

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

更笼统地说(哈哈):是否有一种既定且合理的方法可以将泛型添加到已经存在的类型中,基本上使用任何类型?

【问题讨论】:

  • 您能否添加要增强的类型的具体示例和期望的结果?
  • 如前所述,而不是PassThrough,我希望能够使用PassThrough&lt;T&gt;,然后以类型安全的方式发出T 类型的对象,而不是发出@ 类型的数据987654331@.
  • “鉴于我不想从头开始创建类型” 您可以从现有类型 stream.d.ts 开始,然后将 chunk: any 替换为 @987654333 @ 并将&lt;T = any&gt; 附加到该文件中的接口和类;和&lt;T&gt; 使用它们的地方。这应该是一个 5 分钟的字符串替换作业。从那里开始,它基于 Typescript 是否可以接受更改,或者是否有一些关于它们的错误。 sry 目前无法在这台计算机上检查自己。
  • 令人难以置信的是,过去几年 Node.js 中缺少类型化的流。我希望有人可以将此&lt;T&gt; 添加到所有流中。

标签: javascript node.js typescript


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 2021-07-10
    • 2019-09-24
    • 1970-01-01
    相关资源
    最近更新 更多