【问题标题】:How do I add a custom static method to an existing node class (e.g. Buffer) in TypeScript?如何在 TypeScript 中向现有节点类(例如 Buffer)添加自定义静态方法?
【发布时间】:2020-11-12 15:05:36
【问题描述】:

我找到了在 TypeScript 中向现有类添加方法的解决方案。我必须在其中声明一个具有相同名称和方法的接口:

declare interface Buffer {
    foo(): string;
}

Buffer.prototype.foo = function(): string {
    return "bar";
}

但是如果我需要向它添加一个静态方法(Buffer.foo,而不是Buffer.prototype.foo)呢?

static 关键字在 declare interface 部分是不允许的并引发错误:'static' modifier cannot appear on a type member. ts(1070)

UPD:

对于@Grey:

你仍然不明白我在寻找什么。我需要一个 VALID(没有 //@ts-ignore)TypeScript 实现 EXACTLY 这个 JavaScript 代码:

// my-module/index.js

Buffer.foo = function() {
    console.log("bar");
}

让用户这样做:

require("my-module");

Buffer.foo();

问题不在于我找不到替代方案。问题是我可以在 JavaScript 中 完全做到这一点 (↑),但不能在 TypeScript 中。 TypeScript 不应该至少在模块结构级别上与 JavaScript 完全兼容吗?我的意思是,我不能在 TS 中实现一个我可以在 JS 中轻松实现的模块是正常的吗?

【问题讨论】:

标签: node.js typescript


【解决方案1】:

建议

根据您的回复: 但我想让我的模块的用户(它只是节点缓冲区的扩展)直接使用 Buffer.foo 调用它

class CustomBuffer extends Buffer {
    public static foo() {
        console.log('I am foo');
    }
}

CustomBuffer.foo(); // I am foo
const buff = CustomBuffer.from('hello world', 'utf8');
console.log(buff); // <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>

【讨论】:

    【解决方案2】:

    是的,你可以。这个想法和你之前做的一样。

    假设我们想给Array添加一个静态方法

    你需要:

    • 找到构造函数的声明
    • 使用所需方法为构造函数声明新接口

    概念验证:

    declare interface ArrayConstructor {
        foo(): string;
    }
    
    Array.foo = () => `hello from static method`;
    
    Array.foo()
    

    对于你的情况,它看起来像

    declare interface Uint8ArrayConstructor {
        foo: () => string;
    }
    
    Buffer.foo()
    

    附: TSC 3.9.6

    【讨论】:

    • “找到构造函数的声明”是什么意思?我已经对BufferConstructor 进行了同样的尝试,但 VSCode 仍然告诉我,Buffer 没有名为 foo 的成员。是不是意味着 Buffer 的构造函数是用另一种方式调用的?那么如何找到它的真名呢?
    • 请检查更新,我认为这是你需要的(除非我们谈论不同的缓冲区)
    • 仍然对我不起作用。对于ArrayConstructorArray.foo 也不起作用。看截图:prnt.sc/tn97fn TS 的版本也是 3.9.6,当然 VSCode 也是最新的。
    • 看起来很神奇。让我们仔细检查一下。创建 index.ts 文件。把第一个例子的代码放在这里。用 TSC 编译它(不要查看 VSCode 错误)。会编译吗?我也在做同样的事情。
    • 是的,它确实适用于新创建的空index.ts。我发现我的错误导致了问题。很难解释,但这只是我的疏忽。很抱歉给您带来麻烦,非常感谢!
    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多