在TypeScript中扩展不覆盖模块

时间:2013-06-26 23:57:01

标签: typescript

让我们说我想扩展一个模块。同时我不想覆盖它的属性。在JavaScript中我会这样做:

var root = this; // window
(function(exports) {
    if ('widget' in exports) return;

    function widget() {
        //
    }

    exports.widget = widget;

})(root.library || (root.library = {}));

似乎TypeScript使用module提供相同的功能。但使用它时,以下方式将不加区别地覆盖先前在widget上定义的任何library属性:

module library {
    export function widget() {
        //
    }
}

现在我可以使用前者但是如果我在函数内部创建一个{4}},那么TypeScript会抱怨嵌套class定义。如果我将定义放在函数之外,那么它就会被导出(比如window),这就是我想要避免的。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您可以使用vars:

module library {
    export var  widget = function () {
        //
    }
}

module library{
    if(library.widget){
        return;
    }
    else{
        library.widget = function(){            
        }   
    }   
}

Try it.

答案 1 :(得分:0)

确定用户错误,以下工作正常,我得到的唯一警告是返回函数定义,但这不是TypeScript错误:

module library {
    if (library.widget) {
        return;
    }

    class Internal {

    }

    export function widget() {

    }
}

答案 2 :(得分:0)

根据要求,这是一个使用基于类的继承来提供小部件然后是小部件的专用版本的简单示例。这允许您重复使用原始窗口小部件中的代码,并相互替换不同类型的窗口小部件,而无需更改调用代码。

module Example {
    export class WidgetBase {
        doWidgetThings() {
            return 'Base widget things';
        }

        doOtherThings() {
            return 'Base other things';
        }
    }

    export class WidgetSpecialisation extends WidgetBase {
        doWidgetThings() {
            return 'Special widget things';
        }

        doOtherThings() {
            return super.doOtherThings();
        }
    }
}

var widget = new Example.WidgetSpecialisation();
alert(widget.doWidgetThings() + ' ' + widget.doOtherThings());