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

Tom*_*mas 9 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);
    }    
}
Run Code Online (Sandbox Code Playgroud)

但TypeScript抛出"type is not assignable"错误.

这样做有更好的方法吗?显然我们可以有两个独立的功能,但我认为以这种方式处理单个vs多个是很好的.

isv*_*all 12

你可以更容易

 addNames(names: ISomeInterface | ISomeInterface[]): void {
        this.names = this.names.concat(names);
 } 
Run Code Online (Sandbox Code Playgroud)

来自MDN

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


Sil*_*ind 10

您还可以使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以这样称呼它:

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

请注意我删除了function关键字,因为否则thisbody块中的关键字可能会失去范围,具体取决于谁调用它.


Mar*_*tin 5

我想这就是你想要的

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)
    }    
}
Run Code Online (Sandbox Code Playgroud)

你想使用instanceOf,而不是 isArray 。