【问题标题】:Extending class with no copying constructor (with private param)没有复制构造函数的扩展类(使用私有参数)
【发布时间】: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


【解决方案1】:

我认为作曲是通往这里的道路。请记住,您正在构建一个类,而不是一个需要 new 运算符才能实例化对象的方法。这可能就是你要找的东西

class A{
  tPub;
  constructor(public pub, private priv) {
   this.tPub=pub
  }
}
class B extends A{
 constructor(pub){
  super(pub)
 }
 myFunc(){} //equiv to B.prototype.myFunc
}

export const myClass=new B();


//another file
import {myClass} from './file'
let m=myClass.myFunc();

不幸的是,通过将 priv 设置为 private,它会完全按照它的要求执行并使其成为私有对象。你也可以不使用构造函数,这取决于你想对你的类做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多