2012-10-13 4 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]; 
     } 

유형의 배열 모양은 해당 Javascript 배열 유형으로 올바르게 변환되지 않습니다. 내가 any[]에 _possession의 종류를 변경하는 경우

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

다음 _possession 필드를 초기화하는 시도 예외를 발생,

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

Person 객체가 포함 된 코드 실행이 생성 된 자바 스크립트에서 미리보기입니다 new Array() 예외로 _possession을 초기화하지 않습니다. 내가 뭐 놓친 거 없니?

답변

104

당신은 여기 구문에 오류가 있습니다 : 이것은 "사물의 배열을"만들지 않습니다

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

. 나는 간단한 동작하는 예제를 만든

this._possessions = new Array(100); 

: 당신이 길이를 설정하려면 배열 생성자의

this._possessions = []; 

: 사물의 배열을 만들려면, 당신은 단순히 배열 리터럴 표현을 사용할 수 있습니다 시도해 볼 수 있습니다 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 개 요소의 배열을 할당합니다. 자바 스크립트에서 이것은 인덱스 100의 값을 Thing처럼 생성자처럼 호출합니다. 이 값은 undefined이므로 언급 한 오류가 발생합니다. JavaScript 및 TypeScript에서는 new Array(100)을 대신 입력해야합니다.

CodePlex의 버그로보고해야합니다.

+1

나는 새로운 어레이 (100)를 원하지 않는다. 나는 형의 배열을 원한다. 이것이 버그인지 또는 문서 스펙을 잘못 해석 한 것인지 나는 알지 못합니다. –

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 권장/최신 구성을 사용할 때 기본값입니다. – Kieran