Расширение функциональности в 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);
}