Closure Compiler предупреждает об аннотации плохого типа. Неизвестный тип… при расширении класса Ecmascript 6

Я получаю предупреждение для каждого класса Ecmascript 6, который наследуется от другого класса при компиляции с помощью Closure Compiler:

Я максимально упростил ситуацию и все равно получаю предупреждение:

/src/main/js/com/tm/dev/Dog.js: WARNING - Bad type annotation. Unknown type module$$src$main$js$com$tm$dev$Animal.default

Скомпилированный код работает корректно. (Я пробовал несколько аннотаций, которые только ухудшили ситуацию.) Кто-нибудь знает, что здесь ожидается?

Animal.js:

export default class{
    constructor(){
        this.legs = [];
    }
    addLeg(legId){
        this.legs.push( legId );
    }
}

Собака.js:

import Animal from './Animal';

export default class extends Animal {
    constructor(){
        super();
        [1,2,3,4].forEach(leg=>this.addLeg(leg));
        console.log( 'Legs: ' + this.legs.toString() );
    }
}

person Seanonymous    schedule 01.06.2016    source источник


Ответы (1)


Подсказка содержится в предупреждающем сообщении, хотя, очевидно, она может ввести в заблуждение, если вы не знакомы с Проверка аннотаций компилятором закрытия.

Компилятор Closure может использовать информацию о типах данных о переменных JavaScript для обеспечения расширенной оптимизации и предупреждений. Однако в JavaScript нет возможности объявлять типы.

Поскольку в JavaScript нет синтаксиса для объявления типа переменной, вы должны использовать комментарии в коде, чтобы указать тип данных.

(Следующее не проверено.)

Компилятор закрытия сообщает, что в Dog.js он не распознает тип Animal. Это потому, что вы экспортируете безымянное выражение класса: export default class.

Таким образом, вы можете дать своему классу имя (export default class Animal), и компилятор закрытия может распознать токен Animal, когда он используется в Dog.js.

И вы также можете дать своему классу JSDoc, который помечает его как @constructor:

/**
 * Animal.
 * @constructor
 */
export default class Animal {}
person sdgluck    schedule 02.06.2016
comment
Спасибо, что отследили это. Это ошибка. Можете ли вы создать проблему для этого? github.com/google/closure-compiler/issues - person Chad Killingsworth; 02.06.2016
comment
@ChadKillingsworth Конечно :-) Ошибка в том, что он не распознает имя импорта безымянного класса как тип? - person sdgluck; 02.06.2016
comment
(вот отправленная проблема) - person sdgluck; 02.06.2016
comment
Спасибо! Итак, я должен пометить класс как конструктор, а не метод «конструктор» внутри класса? - person Seanonymous; 02.06.2016
comment
Я добавил имя класса, как указано выше (экспорт класса Animal по умолчанию), и все равно получил предупреждение. Добавление аннотации над классом дает дополнительное предупреждение: ПРЕДУПРЕЖДЕНИЕ. Неуместная аннотация функции. Этот JSDoc не привязан к функциональному узлу. Вам не хватает скобок? - person Seanonymous; 02.06.2016
comment
Мои извинения. В своем ответе я не указал, что не проверял предложения. (Поскольку классы де-сахарятся для функций, я ожидал, что аннотация сработает.) Увы, похоже, мои предположения были неверными... Надеюсь, проблема на GitHub будет поднята, и она будет решена в ближайшее время. - person sdgluck; 02.06.2016