2016-03-02 54 views
6

在函數使用單個對象或某些類型的對象數組時,我們正在使用簡單的函數聲明。使用一個或一組對象的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); 
    }  
} 

但打字稿拋出 「類型不分配」 的錯誤。

有沒有更好的方法來做到這一點?顯然我們可以有兩個獨立的函數,但我認爲用這種方式處理單個對多個是相當好的。

+1

普羅蒂普:不是IsArray的,使用的名稱= [] .concat(地名)。鍍鉻速度提高43%。 –

回答

8

你可以更容易

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

MDN

The concat() method returns a new array comprised of the array on which it is called joined with the array(s) and/or value(s) provided as arguments.

+0

偉大的例子,我如何過度工程的東西,而不是正確閱讀規格......謝謝!我會繼續接受其他答案,因爲它有一些關於TS的額外信息,人們似乎不知道,它給了你更多的靈活性,以便如何傳遞參數 – Tom

+0

實際上,這仍然編譯成錯誤:'錯誤:(TS2345:「ISomeInterface |」類型的參數ISomeInterface []'不能分配給'ISomeInterface'類型的參數。 類型'ISomeInterface []'不可分配給'ISomeInterface'類型。' – Tom

+0

@Tom我已將'tsc'更新爲'版本1.9.0-dev.20160302'現在它適用於我 – isvforall

2

官方途徑打字稿處理,這是具有多功能特徵,例如:

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

您可以在official handbook here

+0

是的,這是我的想法,但如果你調用addNames(「你好世界」)它不會拋出任何錯誤,所以基本上你可以使用':any'聲明,它將是相同的... – Tom

+0

我想你必須在那個時候自己驗證一下。我不確定它是如何工作的,但是你可以用'name?:ISomeInterface,names?:ISomeInterface []''替換'names:any'。這應該阻止傳遞一個字符串,但它可以讓你傳遞任何東西或兩者也。然後在函數內部使用'names || [名稱]'這將是非常無縫。 – Marie

5

看到更多的信息,你也可以使用其他參數:

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關鍵字可能會失去範圍,具體取決於誰將其調用。

+0

是的,美麗的,我知道關於休息參數,但我不知道的是,它編譯自己總是一個數組params。謝謝! – Tom

+0

我不知道其他參數編譯。這是一個很好的解決方案! – Marie

+1

@Tom我也會建議實例化數組,因爲它會阻止你在任何地方進行'null'檢查。 '公開的名字:ISomeInterface [] = [];' – Silvermind

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的東西。

+0

對不起,我的要求是什麼,你的代碼仍然給出了相同的錯誤 – Tom

相關問題