这是一般性最佳实践问题,但请考虑以下TypeScript代码:
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并仍然得到代码提示?
答案 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。