52

可能重复:
原型如何在打字稿上扩展?

我目前正在学习 TypeScript,并且想知道如何向现有对象添加功能。假设我想将 Foo 的实现添加到 String 对象。在 JavaScript 中,我会这样做:

String.prototype.Foo = function() {
    // DO THIS...
}

了解 TypeScript 类、接口和模块是开放式的,这让我尝试了以下操作,但没有成功

1. 引用 TypeScript 中的 JavaScript 实现

    JavaScript:

    String.prototype.Foo = function() {
        // DO THIS...
    }

    TypeScript:

    var x = "Hello World";
    x.Foo(); //ERROR, Method does not exist

2.扩展接口

interface String {
    Foo(): number;
}

var x = "Hello World";
x.Foo(); //Exists but no implementation.

3.扩展类

class String {
    Foo(): number {
        return 0;
    }
}

// ERROR: Duplicate identifier 'String'

正如您从这些结果中看到的那样,到目前为止,我已经能够通过接口契约添加该方法,但没有实现,那么,我该如何定义和实现我的 Foo 方法作为预先存在的 String 类的一部分?

4

1 回答 1

66

我找到了解决方案。它结合了接口和 JavaScript 实现。该接口为 TypeScript 提供合约,允许新方法的可见性。JavaScript 实现提供了在调用方法时将执行的代码。

例子:

interface String {
    foo(): number;
}

String.prototype.foo= function() {
    return 0;
}

从 TypeScript 1.4 开始,您现在还可以扩展静态成员:

interface StringConstructor {
    bar(msg: string): void;
}

String.bar = function(msg: string) {
    console.log("Example of static extension: " + msg);
}
于 2012-12-16T01:32:07.313 回答