Важно помнить, что классы в 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
.