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块中的关键字可能会失去范围,具体取决于谁调用它.
我想这就是你想要的
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 。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           9808 次  |  
        
|   最近记录:  |