采用一个或一组对象的 Typescript 函数

新手上路,请多包涵

我们经常使用简单的函数声明,其中函数采用单个对象或某种类型的对象数组。

简单的声明是:

 interface ISomeInterface {
    name: string;
}

class SomeClass {
    public names: ISomeInterface[] = [];

    public addNames(names: ISomeInterface | ISomeInterface[]): void {
        names = (!Array.isArray(names)) ? [names] : names;
        this.names = this.names.concat(names);
    }
}

但是 TypeScript 抛出“类型不可分配”错误。

有更好的方法吗?显然我们可以有两个独立的函数,但我认为以这种方式处理单个函数和多个函数是相当不错的。

原文由 Tomas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 303
2 个回答

你可以让它更容易

 addNames(names: ISomeInterface | ISomeInterface[]): void {
        this.names = this.names.concat(names);
 }

来自 MDN

concat() 方法返回一个新数组,该数组由调用它的数组与作为参数提供的数组和/或 连接而成。

原文由 isvforall 发布,翻译遵循 CC BY-SA 3.0 许可协议

您还可以使用 rest 参数:

 interface ISomeInterface {
    name: string;
}

class SomeClass {
    public names: ISomeInterface[] = []; // create an instance if applicable.

    addNames(...names: ISomeInterface[]): void {
        // the names argument will always be an array
        this.names = this.names.concat(names);
    }
}

你可以这样称呼它:

 addNames(name1); // just pass one
addNames(name1, name2, name3); // pass more comma separated
addNames(...[name1, name2, name3]); // pass an array.

请注意,我删除了 function 关键字,否则 body 块中的 this 关键字可能会失去范围,具体取决于调用它的人。

原文由 Silvermind 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏