我们如何在 TypeScript 中为非全局接口创建扩展方法?

M B*_*M B 6 extension-methods typescript

我目前正在学习 TypeScript,但对如何实现非全局接口的扩展方法感到非常困惑。考虑以下示例:假设我有interface一个像这样的定义Cart

interface Cart {
    id(): string,
    name(): string,
    quantity(): number

    /* Other methods */
}
Run Code Online (Sandbox Code Playgroud)

然后,我想添加一个类似于以下内容的扩展方法:

Cart.prototype.isValid = function() {
    return this.quantity() > 0;
}
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为Cart不是类型,但我很困惑,因为Promise也定义为 an interface,但我可以成功地向其添加扩展方法。例如:

declare global {
    interface Promise<T> {
        hello(): string
    }
}

Promise.prototype.hello = function() {
    return "Hello!";
}

export {};
Run Code Online (Sandbox Code Playgroud)

是否可以扩展非全局接口,Cart如果可以,我该怎么做?

Cha*_*cao 0

就您而言, Cart 只是一种类型。没有对象,您无法扩展类型/接口引用的原型。没有要扩展的原型,您可以使用一些实现 Cart 的对象来实现。

就 Promise 而言,它是一个浏览器 API,如果您进入浏览器控制台并输入 Promise,您将看到那里有一个对象。当您像您给出的示例一样扩展 Promise 原型时,您并没有扩展接口,而是扩展了提供的对象。

如果您想这样做,一种可能的解决方案是界面组合,例如:

interface CartSpecial extends Cart {
    ...
}
Run Code Online (Sandbox Code Playgroud)