【问题标题】:Angular2 multiple constructor implementations are not allowed TS2392Angular2 不允许多个构造函数实现 TS2392
【发布时间】:2017-04-23 00:47:22
【问题描述】:

如何在一个组件中使用多个构造函数?目前我收到错误:

'不允许多个构造函数实现'。

questions: any[];
constructor( service: QuestionSignupStepOneService ) { 
    this.questions = service.getQuestions(); 
}
constructor( service: QuestionSignupStepOneAService ) { 
    this.questions = service.getQuestions(); 
}

有没有办法简化我想要做的事情?代码可以正确编译,但只会运行第一个服务,而忽略第二个。

2021 年编辑:我很久以前就意识到这是一个愚蠢的问题,但我将把它搁置起来,因为如果我对构造函数的理解不够,无法提出这个问题,那么其他人也可能会发现自己在这里

【问题讨论】:

  • 不能用逗号吗:constructor( service: QuestSignupStepOneService, serviceA:QuestionSignupStepOneAService) ?
  • 你想做什么?多态性?
  • @Kilmazing 我不这么认为。现在出现此错误:错误 TS2304:找不到名称“QuestSignupStepOneService”。 questions: any[]; constructor( service: QuestSignupStepOneService, serviceA: QuestionSignupStepOneAService ) { this.questions = service.getQuestions(); this.questions = serviceA.getQuestions(); }
  • @anthonyc 看来我是……也许我把事情复杂化了
  • @EricBerndt,应该是QuestionSignupStepOneService 而不是QuestSignupStepOneService?我想应该在注册服务的 app.js 文件中完成,比如if(yourUseCase){module.service('QuestionSignupStepOneService ', QuestionSignupStepOneService );}else{module.service('QuestionSignupStepOneService ', QuestionSignupStepOneAService )

标签: angular


【解决方案1】:

使用相同参数创建多个构造函数没有意义,除非它们具有不同的类型,在 Typescript 中您可以执行以下操作:

class Foo {
  questions: any[];
  constructor(service: QuestionSignupStepOneService, param2?: Param2Type) { 

    this.questions = service.getQuestions(); 
    if(param2){
        console.log(param2);
    }
  }
}

这等于两个构造函数,第一个是new Foo(service),第二个是new Foo(service, param2)

使用? 表示该参数是可选的。

如果你想要两个具有相同参数但类型不同的构造函数,你可以使用这个:

class Foo {
  questions: any[];
  constructor(service: QuestionSignupStepOneService | QuestionSignupStepOneAService) {

    if(service instanceof QuestionSignupStepOneService){
       this.questions = service.getQuestions(); 
    }
    else {
       this.questions = service.getDifferentQuestions(); 
    }
  }
}

【讨论】:

    【解决方案2】:

    我最终得到了这个(它在语法上是正确的,但还不知道它是否会起作用):

      constructor(private _myService: MyService, private _myOtherService: MyOtherService) {
        super(_myService);
        this.dataSource = new MyThingDataSource(this._myOtherService);
        }
    

    【讨论】:

      猜你喜欢
      • 2019-02-21
      • 2020-07-24
      • 2019-07-03
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多