Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extending functionality in TypeScript [duplicate]

Possible Duplicate:
How does prototype extend on typescript?

I am currently learning TypeScript, and would like to know how it is possible to add functionality to existing objects. Say I want to add an implementation for Foo to the String object. In JavaScript I would do this:

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

Understanding that TypeScript classes, interfaces and modules are open ended led me to try the following, without success

1. Reference the JavaScript implementation from TypeScript

    JavaScript:      String.prototype.Foo = function() {         // DO THIS...     }      TypeScript:      var x = "Hello World";     x.Foo(); //ERROR, Method does not exist 

2. Extend the interface

interface String {     Foo(): number; }  var x = "Hello World"; x.Foo(); //Exists but no implementation. 

3. Extend the class

class String {     Foo(): number {         return 0;     } }  // ERROR: Duplicate identifier 'String' 

As you can see from these results, so far I have been able to add the method via an interface contract, but no implementation, so, how do I go about defining AND implementing my Foo method as part of the pre-existing String class?

like image 518
Matthew Layton Avatar asked Dec 16 '12 01:12

Matthew Layton


People also ask

Can I extend more than one class in TypeScript?

In TypeScript, we can't inherit or extend from more than one class, but Mixins helps us to get around that. Mixins create partial classes that we can combine to form a single class that contains all the methods and properties from the partial classes.

Can we use extends and implements together in TypeScript?

Yes you can do that.

What does Extends do TypeScript?

Interfaces extending classes TypeScript allows an interface to extend a class. In this case, the interface inherits the properties and methods of the class. Also, the interface can inherit the private and protected members of the class, not just the public members.


1 Answers

I have found the solution. It takes a combination of the interface and the JavaScript implementation. The interface provides the contract for TypeScript, allowing visibility of the new method. The JavaScript implementation provides the code that will be executed when the method is called.

Example:

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

As of TypeScript 1.4 you can now also extend static members:

interface StringConstructor {     bar(msg: string): void; }  String.bar = function(msg: string) {     console.log("Example of static extension: " + msg); } 
like image 102
Matthew Layton Avatar answered Sep 23 '22 00:09

Matthew Layton