TypeScript中的新功能。我有一组预设,用户可以添加或修改现有的预设。由于它只有几个键,我创建了一个界面。
static stylePresets : Array<IStylePreset> = [
{ type: "default", backgroundColor: "#37474f" , color: "#ECEFF1"},
{ type: "success", backgroundColor: "#37474f", color: "#ECEFF1" },
{ type: "error", backgroundColor: "#d32f2f", color: "#EEE"}
];
实施在这里:
static config = {
types(newPresets) : void {
newPresets = [].concat(newPresets);
for(var i = 0, len = newPresets.length, current; i< len; i++){
var pos = Message.Util.find(Message.stylePresets, newPresets[i].type)
current = newPresets[i];
if(pos !== -1) for(var key in current) Message.stylePresets[pos][key] = current[key];
else Message.stylePresets[Message.stylePresets.length] = current;
}
}
};
现在我有一个配置功能,可以使用自定义预设来更改现有预设或添加新预设。
newPresets
问题是,我无法弄清楚newPresets = [].concat(newPresets);
类型中要指定的内容,因为它接受了一个对象数组以及一个单个对象(单个元素数组{{1}})。
我试图学习TypeScript,但我不知道我做的是否正确。有人可以帮帮我吗?进一步阅读材料或文档将是黄金。
答案 0 :(得分:1)
你可以:
1)使用any
类型:types(newPresets : any)
或
2)保留IStylePreset[]
类型(例如types(newPresets : IStylePreset[])
,当传递单个对象时,只需将其包装成如下数组:config.types([{ type: "default", backgroundColor: "#37474f" , color: "#ECEFF1"}]);
答案 1 :(得分:1)
使用TypeScript union type:IStylePreset | IStylePreset[]
。
在函数体中,您可以使用Array.isArray()
检查是否传递了数组或单个实例。实际上,在这种情况下,concat()
已经在内部检查是否连接了数组或实例,因此解决方案很简单:
E.g:
class Config {
private presets: IStylePreset[] = [];
public addPresets(presetOrArray: IStylePreset | IStylePreset[]) {
// Concat will concat either Array or instance
this.presets = this.presets.concat(presetOrArray);
}
public getPresets(): IStylePreset[] {
return this.presets;
}
}
let config = new Config();
config.addPresets(stylePresets);
config.addPresets(stylePresets[0]);
console.log(config.getPresets().length); // prints 4