Понимание определенного типа наследования в TypeScript - PullRequest
0 голосов
/ 04 марта 2019

Может кто-нибудь объяснить, что означает этот тип наследования в TypeScript?Есть ли шанс создать псевдоним для всего, что у нас есть после ключевого слова extends?

class MyClass extends (FooClass as { new(): BarClass })

1 Ответ

0 голосов
/ 04 марта 2019

Важно помнить, что классы в TypeScript существуют как в пространстве «значений» (сфера объектов, которые существуют во время выполнения), так и в пространстве «типов» (сфера концепций, которые существуют только во время компиляции).Рассмотрим, как это компилируется в ES5:

class MyClass extends (FooClass as { new(): BarClass }) { }

Становится:

var MyClass = /** @class */ (function (_super) {
    __extends(MyClass, _super);
    function MyClass() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    return MyClass;
}(FooClass));

Обратите внимание, что FooClass передается как часть идиомы определения типа как ссылка на _super class, но на BarClass вообще нет ссылок (подсказка: потому что он находится в пространстве 'type').Таким образом, FooClass здесь ссылается на значение из FooClass, но предполагает, что значение FooClass имеет тип { new(): BarClass }.

Другими словами, тип, который используется здесь дляцель проверки типа - просто { new(): BarClass }, но во время выполнения MyClass фактически расширится FooClass.Я полагаю, насколько велико это различие, зависит от точных определений FooClass и BarClass.

...