【发布时间】:2017-02-07 12:58:08
【问题描述】:
在尝试增强 Angular 的 ComponetFixture 时,我注意到由于此类没有复制构造函数,因此无法完成此操作。 (还是我错了?)
假设我们有一个类:
class A
{
constructor(public pub, private priv) { }
}
而我想基于 A 类创建 BetterA 类,所以:
class BetterA extends A
{
constructor(a: A)
{
// super(a); <----- this can not be done, so maybe...
// super(a.pub, a.priv) // ...this could be better option, but...
}
myFunction(a: string) { return a; }
}
...第二个参数是 PRIVATE。我无法访问它;/
在这种情况下我该怎么办?
我知道一种解决方案是使用这样的原型:
A.prototype['myFunction'] = function(a: string) { return a; } // this must be done with function keyword, it's not working with ()=>{} !!! /there are problem with this pointer/
但是我必须写一些像这样奇怪的东西:
console.log( classAobject['myFunction']("abc") );
代替
console.log( classAobject.myFunction("abc") );
或
我可以通过组合来做到:
class B
{
public a: A; // or constructor(public a: A)
myFunction(a) { return a; }
}
但似乎不太优雅。
有没有更好的解决方案?
编辑#1
我刚刚发现这种语法:
Class.prototype.NewFunction = function() { this.x.y.z = 123 }
有效但会产生编译器错误,代码有效但我们得到:
'属性'TextOf'在类型'Class'上不存在
当你尝试这样称呼它时:
objectOfClass.NewFunction()
制作:
'属性'NewFunction'在类型'Class'上不存在
但是
只有当我们使用 function 关键字时它才会起作用。当我们使用 lambda 表达式时,某些函数也会出现同样奇怪的隐形问题。
【问题讨论】:
-
你的最后一个组合示例是否解决了你的功能需求?如果是这样,我认为没有问题。
-
这可以解决我的问题,但现在我需要在很多地方更改我的代码,而不是更改类声明。我尝试使用类似于第一个但没有索引器 notatnion ['myFunction'] 的 stackoverflow.com/a/13897813/4584448 解决方案,但它不起作用;/
-
我想我们很多人都不熟悉如何使用它。如果您能提供
BetterA的使用示例代码,那就太棒了。
标签: angularjs typescript