如何在TypeScript 2.5中扩展NodeJS.ReadableStream原型?

时间:2018-04-04 22:30:32

标签: typescript

我想将一个原型函数添加到NodeJS.ReadableStream。这是我尝试过的代码以及产生的错误。

my.d.ts

declare namespace NodeJS {
    interface ReadableStream {
        readAll(encoding: string): Promise<string>;
    }
}

my.ts

namespace NodeJS {
    ReadableStream.prototype.readAll = function (this: ReadableStream, encoding: string) {
        // do stuff
    };
}

错误

  • lib.es6.d.ts:属性'readAll'在'ReadableStream'类型中不存在。

    我不确定如何在my.ts内正确引用NodeJS ReadableStream接口而不是lib.es6的ReadableStream接口。我尝试通过namespace NodeJS提供范围,但它不起作用。

  • node \ @types \ index.d.ts: Class'Readable'错误地实现了接口'ReadableStream'。 “可读”类型中缺少属性“readAll”。

相关

请注意,我尝试使用How to extend String Prototype and use it next, in TypeScript问题中的学习,但尚未找到解决方案。

编辑#1

根据要求,这是node\@types\index.d.ts产生第二个错误的代码。定义Readable类的最后一行特别是错误。代码源自依赖"@types/node": "^8.5.8"。注意,我觉得这是来自7000+行文件的相关代码,不会粘贴其余部分。您可以在完整的荣耀here中查看它。

declare module "stream" {
    import * as events from "events";

    class internal extends events.EventEmitter {
        pipe<T extends NodeJS.WritableStream>(destination: T, options?: { end?: boolean; }): T;
    }

    namespace internal {
        export class Stream extends internal { }

        export interface ReadableOptions {
            highWaterMark?: number;
            encoding?: string;
            objectMode?: boolean;
            read?: (this: Readable, size?: number) => any;
            destroy?: (error?: Error) => any;
        }

        export class Readable extends Stream implements NodeJS.ReadableStream {

编辑#2

通过评论中的建议,我得到了以下代码,它解决了两个原始编译器错误。但是,在运行时myReadableStreamVariable.readAll is not a function会弹出另一个错误。

my.ts

declare namespace NodeJS {
    interface ReadableStream {
        readAll: typeof readAll;
    }
}

function readAll(this: NodeJS.ReadableStream, encoding: string) {
    // do stuff
};

hack.ts

import { Readable } from "stream";

declare module "stream" { interface Readable extends NodeJS.ReadableStream { } }

0 个答案:

没有答案