Расширение функциональности в TypeScript

Возможный дубликат:
Как прототип распространяется на typescript?

В настоящее время я изучаю TypeScript и хотел бы знать, как можно добавить функциональность к существующим объектам. Скажем, я хочу добавить реализацию для Foo в объект String. В JavaScript я бы сделал следующее:

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

Понимание того, что классы, интерфейсы и модули TypeScript открыты, привели меня к следующему, без успеха

1. Ссылка на реализацию JavaScript из TypeScript

    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 как часть ранее существовавшего Класс строк?

Ответ 1

Я нашел решение. Он использует комбинацию интерфейса и реализацию 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);
}