2

假设我想扩展一个模块。同时我不想覆盖它的属性。在 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() {
        //
    }
}

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

有任何想法吗?

4

3 回答 3

0

你可以用 vars 做到这一点:

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

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

试试看。

于 2013-06-27T01:49:00.677 回答
0

OK user error,以下工作正常,我得到的唯一警告是返回函数定义之外,但这不是 TypeScript 错误:

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

    class Internal {

    }

    export function widget() {

    }
}
于 2013-06-27T08:07:22.563 回答
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());
于 2013-06-29T19:28:36.417 回答