从构造函数返回实例

时间:2014-08-20 12:30:48

标签: inheritance typescript

有没有办法强制使用Typescript编译器从构造函数返回实例化的实例?目前,缺乏能够找到这样做的方法是让我从子类化Collection type in Typescript

inspecting the output from the TypeScript compiler之后我发现编译器在继承我的Collection类型

时会输出以下内容
var MyCollection = (function (_super) {
    __extends(MyCollection, _super);
    function MyCollection() {
        _super.apply(this, arguments);
    }
    return MyCollection;
})(Collection);

它不返回_super.apply(this, arguments);的结果这一事实使得从Collection类返回数组实例的整个技巧无效。

目前,我能想出的创建可以使用TypeScript编译器的东西的唯一方法就是用JavaScript完成所有工作,然后定义一个围绕该类型的接口......

1 个答案:

答案 0 :(得分:1)

您需要执行类似于Collection类'构造函数中的操作。

injectClassMethods函数更改为可以与其他类重用,或者只修改现有函数:

static injectClassMethods(collection, prototype) {
    // Loop over all the prototype methods and add them
    // to the new collection.
    for (var method in prototype) {
        // Make sure this is a local method.
        if (prototype.hasOwnProperty(method)) {
            // Add the method to the collection.
            collection[ method ] = prototype[ method ];
        }
    }

    // Return the updated collection.
    return( collection );
}

现在你可以像这样编写一个新的扩展类:

class ExtendedCollection extends Collection {
    constructor(...items: any[]) {
        var s = <any>super();

        Collection.injectClassMethods(s, ExtendedCollection.prototype);

        Array.prototype.push.apply(s, items);

        return s;
    }

    // Example method
    printFirstItem() {
        document.write(this[0]);
    }
}

Playground


请注意,当前的实现正在做类似......

var myCollection = new ExtendedCollection().add("Asdf");

...会导致myCollection被打字稿键入为Collection而不是ExtendedCollection,因为该函数的返回类型为Collection

有一个关于here的公开问题。


顺便说一下,我分享了这个要点并制作了a few changes,这样可以更容易继承。另外,我修复了一些错误(比如constructoraddAll方法接受多于零的参数而没有编译错误。)