接受Type接口或TypeScript中的单个接口

时间:2016-09-29 09:16:16

标签: javascript arrays typescript interface

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,但我不知道我做的是否正确。有人可以帮帮我吗?进一步阅读材料或文档将是黄金。

2 个答案:

答案 0 :(得分:1)

你可以:

1)使用any类型:types(newPresets : any)

2)保留IStylePreset[]类型(例如types(newPresets : IStylePreset[]),当传递单个对象时,只需将其包装成如下数组:config.types([{ type: "default", backgroundColor: "#37474f" , color: "#ECEFF1"}]);

答案 1 :(得分:1)

使用TypeScript union typeIStylePreset | 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