使用扩展对象构造函数?

时间:2014-05-24 01:54:31

标签: typescript

这是一般性最佳实践问题,但请考虑以下TypeScript代码:

Link

class MyClass{
    defaults={
        foo:"foo",
        bar: "bar"
    }
    options:any;
    constructor( options?:any){
        this.options = $.extend(this.defaults, options);
    }
}

declare var $;

class Other{
    constructor(){
        var myClass:MyClass=new MyClass({foo:"foomanchu"});
        console.log(myClass.options.foo);
    }
}

这里的想法是MyClass如果可能的话不应该有无穷无尽的构造函数,例如:

 myClass("foo", "bar", "some", "other", "stuff");

这很糟糕,因为如果MyClass发生更改,则使用它的每个类都必须更新其构造函数调用。

但正如另一位开发人员指出的那样,如果我将所有这些东西作为构造函数元素,我会得到很好的代码提示。例如,在IntelliJ中,只要我键入括号,我就会得到一个预期的每个参数的列表。另一方面,如果我将它们留作“monadic”对象,那么Other中的代码更具可读性。我知道构造函数变量是什么,因为我看到它们被命名。因此,对于其他开发人员阅读我的代码,选项1更好。对于编写代码的人来说,选项2更好,因为我得到了代码提示。

所以问题1是:哪种更好的做法?

问题2是:有没有一种方法我忽略了使用选项1并仍然得到代码提示?

3 个答案:

答案 0 :(得分:1)

这就是我的所作所为:

class MyClass {
    constructor(public options: { foo?: string; bar?: string; } = {}) {
        this.options = $.extend({
            foo: "foo",
            bar: "bar"
        }, options);
    }
}

declare var $;

class Other {
    constructor() {
        var myClass: MyClass = new MyClass({ foo: "foomanchu" });
        console.log(myClass.options.foo);
    }
}

答案 1 :(得分:0)

这可能是一种潜在的方式。

class another{
    constructor(public foo = "foo", public bar = "bar"){
    }
}
var an:another = new another("foomanchu");

答案 2 :(得分:0)

我认为您的解决方案并不坏 - 与构建JQuert小部件时的操作类似。

无论如何,打字稿有一个“params”(如果你熟悉C#,你应该知道我的意思)功能,你可以传递你想要的任意数量的项目。 我不确定这是最好的事情,但看起来这就是你想要的。

以下是params的简短示例:

class Test {
    Method1(value: string) { // only for single string value
        alert("" + value);
    }
    Method2( ...params: number[]) { // Params but number type
        for (var i = 0; i < params.length; i++) {
            alert("" + params[i]);
        }
    }
    Method3( ...params: any[]) { // params with any type
        for (var i = 0; i < params.length; i++) {
            alert("" + params[i]);
        }
    }
}
window.onload = () =>{
    var data = new Test();
    data.Method1("Mcn Solution");
    data.Method2(1,2,3,4,5,6);
    data.Method3(1,"Mcn",3.3,'c');
}

再阅读here