2012-12-16 82 views
34

可能重复:
How does prototype extend on typescript?在打字稿扩展功能

目前我正在学习打字稿,并想知道它是如何可能将功能添加到现有的对象。假设我想为Foo添加一个实现到String对象。从打字稿

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

应该理解的是打字稿类,接口和模块是开放式的使我尝试以下,没有成功

1.参考JavaScript实现:在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类的一部分?

回答

48

我找到了解决方案。它需要接口和JavaScript实现的组合。该界面提供了TypeScript的契约,可以看到新方法。 JavaScript实现提供了在调用方法时将执行的代码。

例子:

interface String { 
    foo(): number; 
} 

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

作为打字稿1.4现在还可以延长静态成员:

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

String.bar = function(msg: string) { 
    console.log("Example of static extension: " + msg); 
} 
+2

没错,这就是它是如何命中注定的。请记住,TypeScript本身不是一种语言,它只是一个语法糖。所以用'JavaScript风格'写一些东西是一个很好的做法,没有任何缺点。 –

+1

这个解决方案是否真的与** String **一起工作?因为我正在做与_exact_相同的事情并且得到编译错误,该属性在String类型中不存在。我错过了什么? (TSC使用1.4.1) – sebas2day

+0

@ sebas2day是它的工作原理 - http://tinyurl.com/ouwh3ln – series0ne