0

有人可以解释一下 TypeScript 中的这种继承是什么意思吗?有没有机会为我们在扩展关键字之后的所有内容创建别名?

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

1 回答 1

0

重要的是要记住,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类的引用传入,但BarClass根本没有被引用(提示:因为它在“类型”空间中)。所以FooClass这里引用了 的FooClass但假定 的值FooClass是 type { new(): BarClass }

换句话说,这里用于类型检查的类型只是{ new(): BarClass }但在运行时,MyClass实际上会扩展FooClass. 我想这种区别真正有多大的区别取决于 和 的确切FooClass定义BarClass

于 2019-03-04T20:31:18.907 回答