ES6 - Как объявить неявного члена класса? - PullRequest
0 голосов
/ 05 мая 2018

Если члены класса созданы из некоторых опций, как их объявить?

class cls {

    constructor(options) {

        Object.assign(this, {
            arr: [],
        }, options);

        this.arr[0] = 1; // <- IDE thinks that arr is an unresolved variable
    }
}

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Только не используйте Object.assign для создания свойств с их значениями по умолчанию. Написать

class cls {
    constructor(options) {
        this.arr = [];
        Object.assign(this, options);
        this.arr[0] = 1; // should work now
    }
}
0 голосов
/ 05 мая 2018

Чтобы свойство класса, которое не было явно определено, было распознано IDE (Jetbrains PhpStorm / WebStorm), можно указать член с помощью JSDoc:

class cls {
    /**
     @name cls#arr
     @type Array
     */

    constructor(options) {...}
}

Поскольку присвоение свойства с помощью Object.assign не дает дополнительных преимуществ, более естественным способом является явное определение свойства в this (как упоминалось в других ответах).

В ES6:

class cls {
   constructor(options) {
        this.arr = [];

        Object.assign(this, options);

        this.arr[0] = 1;
    }
}

В ES.next с предложением поля класса , требуется предустановка стадии 3 (или ниже) в Babel:

class cls {
   arr = [];

   constructor(options) {
        Object.assign(this, options);

        this.arr[0] = 1;
    }
}

Поля класса оцениваются перед телом конструктора, опция ES.next является синтаксическим сахаром для опции ES6. Эти два параметра идентичны и распознаются в IDE.

0 голосов
/ 05 мая 2018

Если вы используете Babel, вы можете использовать свойство класса вместо:

class cls {
    arr = []
    constructor(options) {
        Object.assign(this, options);
        this.arr[0] = 1;
    }
}
...