2012-10-13 22 views
88

我有一個TypeScript類的定義,像這樣開始;TypeScript輸入的數組使用

module Entities {   

    export class Person { 
     private _name: string; 
     private _possessions: Thing[]; 
     private _mostPrecious: Thing; 

     constructor (name: string) { 
      this._name = name; 
      this._possessions = new Thing[100]; 
     } 

看起來像一個類型數組Thing沒有正確地轉換到相應的JavaScript數組類型。這是從生成的JavaScript代碼段:

function Person(name) { 
    this._name = name; 
    this._possessions = new Entities.Thing[100](); 
} 

執行包含Person對象代碼,扔試圖初始化_possession字段時一個例外:

Error is "0x800a138f - Microsoft JScript runtime error: Unable to get value of the property '100': object is null or undefined".

如果更改_possession的類型any[]並用new Array()初始化_possession並不拋出異常。我錯過了什麼?

回答

104

您在這裏你的語法有一個錯誤:

this._possessions = new Thing[100](); 

這不會創建一個「東西陣」。要創建一個事物的數組,你可以簡單地使用數組常量表達式:

this._possessions = []; 

數組構造器,如果你想設置的長度:

this._possessions = new Array(100); 

我已經創建了一個簡單的工作示例可以嘗試在playground

module Entities { 

    class Thing { 

    }   

    export class Person { 
     private _name: string; 
     private _possessions: Thing[]; 
     private _mostPrecious: Thing; 

     constructor (name: string) { 
      this._name = name; 
      this._possessions = []; 
      this._possessions.push(new Thing()) 
      this._possessions[100] = new Thing(); 
     } 
    } 
} 
+2

它不固定長度,而是應該預先分配數組 – Sebastian

+0

爲什麼你不能'private _possessions:Thing []:[]; '在班級定義中? – SuperUberDuper

8

翻譯是正確的,表達式的類型不是。 TypeScript錯誤地將表達式new Thing[100]作爲數組輸入。使用索引操作符索引Thing(構造函數)應該是錯誤的。在C#中,這將分配一個由100個元素組成的數組。在JavaScript中,這個索引值爲Thing索引100的值,就好像是一個構造函數。由於該值爲undefined它會引發您提到的錯誤。在JavaScript和TypeScript中,您需要改爲new Array(100)

您應該將此報告爲CodePlex上的錯誤。

+1

我不希望有新的陣列(100)。我想要一個Thing類型的數組。我不知道這是一個錯誤還是僅僅是我對文檔規範的誤解。 –

44

你可以嘗試其中任何一種。他們不會給我錯誤。

這也是從typescript for array declaration建議的方法。使用Array<Thing>它正在使用打字稿中的泛型。這與在c#代碼中請求List<T>類似。

// Declare with default value 
private _possessions: Array<Thing> = new Array<Thing>(); 
// or 
private _possessions: Array<Thing> = []; 
// or -> prefered by ts-lint 
private _possessions: Thing[] = []; 

// declare 
private _possessions: Array<Thing>; 
// or -> preferd by ts-lint 
private _possessions: Thing[]; 

constructor(){ 
    //assign 
    this._possessions = new Array<Thing>(); 
    //or 
    this._possessions = []; 
} 
+2

要預先分配大小,請使用'new Array (100)'。 –

+1

你也可以使用... [] – danday74

+0

@ danday74 - 我已更新包含您的方法,這是使用ts-lint recomended/latest config時的默認值。 – Kieran