2013-02-04 143 views
27

我在打字稿以下類:如何在TypeScript中實例化,初始化和填充數組?

class bar { 
    length: number; 
} 

class foo { 
    bars: bar[] = new Array(); 
} 

然後我有:

var ham = new foo(); 
ham.bars = [ 
    new bar() {   // <-- compiler says Expected "]" and Expected ";" 
     length = 1 
    } 
]; 

有沒有辦法做到這一點的打字稿?

UPDATE

我想出了另一種解決方案由具有一套方法返回本身:

class bar { 
    length: number; 

    private ht: number; 
    height(h: number): bar { 
     this.ht = h; return this; 
    } 

    constructor(len: number) { 
     this.length = len; 
    } 
} 

class foo { 
    bars: bar[] = new Array(); 
    setBars(items: bar[]) { 
     this.bars = items; 
     return this; 
    } 
} 

所以你可以如下初始化:

var ham = new foo(); 
ham.setBars(
    [ 
     new bar(1).height(2), 
     new bar(3) 
    ]); 
+0

在TypeScript中使用類似於C#的對象初始值設定項將非常有用。 '[{length:1}]'不是bar的實例,但如果支持,'new bar(){length = 1}'將是bar的實例。也許我們應該爲此提出功能建議? – orad

回答

30

有ISN像JavaScript或TypeScript中的對象那樣的字段初始化語法。

選項1:

class bar { 
    // Makes a public field called 'length' 
    constructor(public length: number) { } 
} 

bars = [ new bar(1) ]; 

選項2:

interface bar { 
    length: number; 
} 

bars = [ {length: 1} ]; 
+3

使事情變得更清晰並且類型安全:'bars:bar [] = [{length:1}]' – Patrice

+0

有沒有辦法在沒有定義類的情況下做到這一點? – blackiii

+0

問題是關於如何在一個類中初始化一個數組。沒有辦法在不使用類的情況下在類中初始化數組。 –

14

如果你真的想有一個名爲參數,再加上有你的對象是你的類的實例,你可以做到以下幾點:

class bar { 
    constructor (options?: {length: number; height: number;}) { 
     if (options) { 
      this.length = options.length; 
      this.height = options.height; 
     } 
    } 
    length: number; 
    height: number; 
} 

class foo { 
    bars: bar[] = new Array(); 
} 

var ham = new foo(); 
ham.bars = [ 
    new bar({length: 4, height: 2}), 
    new bar({length: 1, height: 3}) 
]; 

另外here是打字稿問題追蹤器上的相關項目。

+0

+1問題鏈接。 您還可以使初始化器值可選: 'options? :{長度?:數字;高度?:數字;}' –