2012-10-13 28 views
88

Tôi có định nghĩa lớp TypeScript bắt đầu như thế này;Cách sử dụng mảng đánh máy 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]; 
     } 

Dường như một loại kiểu Thing không được dịch chính xác sang loại mảng Javascript tương ứng. Đây là một đoạn trích từ JavaScript tạo:

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

thực thi mã chứa một đối tượng Person, ném một ngoại lệ khi cố gắng khởi tạo lĩnh vực _possession:

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

Nếu tôi thay đổi loại _possession để any[] và khởi tạo _possession với new Array() ngoại lệ không được ném. Tôi đã bỏ lỡ một cái gì đó?

Trả lời

104

Bạn có một lỗi trong cú pháp của bạn ở đây:

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

này không tạo ra một "mảng của sự vật". Để tạo một mảng của sự vật, bạn chỉ có thể sử dụng các biểu đen mảng:

this._possessions = []; 

Trong số các nhà xây dựng mảng nếu bạn muốn thiết lập độ dài:

this._possessions = new Array(100); 

Tôi đã tạo ra một ví dụ làm việc ngắn gọn bạn có thể thử trong số 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

nó không sửa chữa độ dài, nhưng thay vào đó nên preallocate mảng – Sebastian

+0

tại sao bạn không thể làm 'private _possessions: Thing []: []; 'trong định nghĩa lớp? – SuperUberDuper

8

Bản dịch là chính xác, việc nhập biểu thức là không. TypeScript đang gõ sai biểu thức new Thing[100] làm mảng. Nó sẽ là một lỗi để chỉ mục Thing, một hàm hàm tạo, sử dụng toán tử chỉ mục. Trong C#, điều này sẽ phân bổ một mảng gồm 100 phần tử. Trong JavaScript, giá trị này gọi giá trị tại chỉ số 100 của Thing như thể là một hàm tạo. Vì giá trị đó là undefined, nó làm tăng lỗi bạn đã đề cập. Trong JavaScript và TypeScript, bạn muốn new Array(100) thay thế.

Bạn nên báo cáo lỗi này là lỗi trên CodePlex.

+1

Tôi không muốn mảng mới (100). Tôi muốn một mảng đánh máy của Thing. Tôi không biết đây có phải là lỗi hay chỉ là sự hiểu sai của tôi về thông số tài liệu. –

44

Bạn có thể thử một trong hai cách này. Họ không cho tôi lỗi.

Đây cũng là phương pháp được đề xuất từ ​​typescript for array declaration.

Bằng cách sử dụng Array<Thing>, nó đang sử dụng các generics trong bản in. Nó tương tự như yêu cầu một mã số List<T> trong mã C#.

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

hay

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

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

Để preallocate kích thước, sử dụng 'new Array (100) '. –

+1

bạn cũng có thể sử dụng ... [] – danday74

+0

@ danday74 - Tôi đã cập nhật để bao gồm phương pháp của bạn, nó là mặc định khi sử dụng ts-lint recomended/config mới nhất. – Kieran

Các vấn đề liên quan