Ошибка TypeScript - публичные методы TS2340 доступны через ключевое слово super - PullRequest
0 голосов
/ 11 мая 2018

У меня есть длинная цепочка наследования с абстрактными классами и интерфейсами в Angular 5. Выдает ошибку error TS2340: Only public and protected methods of the base class are accessible via the 'super' keyword.

У абстрактного родительского класса есть метод, определенный как:

public get text() {
    return this.el.attr('text/text').replace("\n", "");
} 

Дочерний класс имеет метод, определенный как:

public get text(): string {
  return super.text;
}

Как заставить дочерний класс не выдавать ошибку TS2340?

Я создал стек-блиц, который демонстрирует проблему:

https://stackblitz.com/edit/ts2340-super-keywork-public?file=app%2Fnodes.ts

Ответы [ 3 ]

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

Как объясняется в другом ответе, это не поддерживается дизайном для переносимых классов в TypeScript.

Возможное решение - десугар super.property, то есть получить функцию-получатель из дескриптора в прототипе родительского класса и применить его к экземпляру класса. Это может быть достигнуто с помощью Reflect.get:

class Foo {
    get foo() {
        return 'foo';
    }
}

class Bar extends Foo {
    get foo() {
        return <Foo['foo']>Reflect.get(Foo.prototype, 'foo', this) + 'bar';
    }
}

new Bar().foo === 'foobar';
0 голосов
/ 14 августа 2018

Это паршивое сообщение об ошибке, но очень важно не игнорировать его!

Мой код, который привел меня к этой ошибке, был следующим:

Tracker.ts

private _name: string;
public get name(): string { return this._name; }
public set name(name: string) { this._name = name; }

SubTracker.ts (расширяет трекер)

super.name = "Simon";   // seems innocuous enough right? 

А потом я получил ошибку:

ошибка TS2340: только открытые и защищенные методы базового класса доступно через ключевое слово super.

Оказывается, когда вы делаете super.name, вы на самом деле перезаписываете саму реализацию суперкласса . Поэтому мне удалось преобразовать name в глобальное статическое свойство. Тогда где-нибудь Я получу доступ к name Я получу последнее значение, которое я установил.


Так в чем же дело? Измените super на this:

this.name = "Simon";

Так что не игнорируйте эту ошибку компилятора!

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

К сожалению, это не поддерживается TS и, судя по всему, никогда не будет:

https://github.com/Microsoft/TypeScript/issues/338

Кажется, что единственный способ заставить его работать на данный момент, это настроить ES6 в опциях компилятора

...