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

时间:2016-03-02 14:22:48

标签: javascript 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抛出“type is not assignable”错误。

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

4 个答案:

答案 0 :(得分:10)

你可以让它更容易

getBasket()

来自MDN

  

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

答案 1 :(得分:9)

您还可以使用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关键字,否则,正文块中的this关键字可能会失去范围,具体取决于是谁调用它。

答案 2 :(得分:2)

打字的官方方式是使用多个功能签名,例如:

addNames(names: ISomeInterface): void;
addNames(names: ISomeInterface[]): void;
addNames(names: any): void {
    ...
}

您可以在official handbook here

中查看更多信息

答案 3 :(得分:0)

我认为这就是你想要的

interface ISomeInterface {
    name: string;
}

class SomeClass {
    public names: ISomeInterface[];

    addNames(names: ISomeInterface | ISomeInterface[]): void {
        names = (names instanceof Array) ? names : [names];
        this.names = this.names.concat(<ISomeInterface[]>names)
    }    
}

您想使用instanceOf,而不是isArray。