машинопись: переменные-члены из конструктора суперкласса - PullRequest
0 голосов
/ 28 апреля 2019

Следующий код выдаст предупреждение undefined

class Parent {
    field: string
    constructor() {
       alert(this.field)
    }
}


class Child extends Parent {
    field = 'child'
}

new Child() #=> undefined

, тогда как следующие предупреждения 'child' ожидаются

class Parent {
    field: string
    constructor() {
       alert(this.field)
    }
}


class Child extends Parent {
    field = 'child'
    constructor() {
       // without referencing this.field before super(), this.field stays undefiend
       this.field
       super()
    }

}

new Child() #=> 'child'

Есть ли способы выполнить следующие условия?

  1. опустить полное объявление конструктора Child, как в первом примере
  2. захватить переменную-член в классе Child?

Ответы [ 3 ]

2 голосов
/ 28 апреля 2019

На ум приходит следующее:

class Parent {
    constructor(public field: string) {
       alert(this.field)
    }
}


class Child extends Parent {
    constructor() {
       super('child');
    }

}

new Child() #=> 'child'

Это не соответствует вашим условиям, но я чувствую, что оно довольно компактное.

2 голосов
/ 28 апреля 2019

Что ж, вы можете отложить доступ к свойству микротаски:

 class Parent {
   field: string
   constructor() {
     Promise.resolve().then(() => {
        alert(this.field)
     };
   }
 }

Но хотя это удовлетворяет вашим условиям, это ... все же неправильный подход. Передайте field в качестве аргумента конструктора, как показывают другие ответы.

1 голос
/ 28 апреля 2019

Невозможно выполнить ваши условия, я почти уверен.

Захват переменной-члена в подклассе происходит после запускается конструктор базового класса, и вызов super() долженбыть первым оператором в конструкторе подкласса.

class Child extends Parent {
    field = 'child';
}
// the above is equal to:
class Child extends Parent {
    constructor(){ super(); this.field = 'child'; }
}

И это приведет к ошибке:

class Child extends Parent {
    constructor(){ 
        this.field = 'child'; // ERROR!
        super(); 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...