TypeScript 유형 배열 사용


96

다음과 같이 시작하는 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 필드를 초기화하려고 할 때 예외가 발생합니다.

오류는 "0x800a138f-Microsoft JScript 런타임 오류 : '100'속성 값을 가져올 수 없습니다 : 개체가 null이거나 정의되지 않았습니다."입니다.

_possession 유형을로 변경하고 any[] _possession을 new Array()예외로 초기화하면 예외가 발생하지 않습니다. 내가 뭐 놓친 거 없니?

답변:


120

여기 구문에 오류가 있습니다.

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

이것은 "사물의 배열"을 생성하지 않습니다. 사물의 배열을 만들려면 배열 리터럴 표현식을 사용하면됩니다.

this._possessions = [];

길이를 설정하려는 경우 배열 생성자 중 :

this._possessions = new Array(100);

놀이터 에서 시도해 볼 수있는 간단한 작업 예제를 만들었습니다 .

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

private _possessions: Thing[] : []; 클래스 정의에서 할 수 없습니까?
SuperUberDuper 2015

54

이 중 하나를 시도해 볼 수 있습니다. 그들은 나에게 오류를주지 않습니다.

또한 배열 선언을 위해 typescript 에서 제안하는 방법입니다 .

를 사용하면 Array<Thing>typescript에서 제네릭을 사용합니다. List<T>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[] = [];

또는

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

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

3
크기를 미리 할당하려면 new Array<Thing>(100).
Doug Domeny

1
당신은 또한 사용할 수 있습니다 ... <Thing> []
danday74

@ danday74-귀하의 방법을 포함하도록 업데이트했으며 ts-lint 권장 / 최신 구성을 사용할 때 기본값입니다.
Kieran

9

번역은 정확하지만 표현의 타이핑은 올바르지 않습니다. TypeScript가 식 new Thing[100]을 배열로 잘못 입력하고 있습니다. Thingindex 연산자를 사용하여 생성자 함수 인 index를 생성하는 것은 오류 여야합니다 . C #에서는 100 개 요소의 배열을 할당합니다. JavaScript에서 이것은 Thing생성자 인 것처럼 인덱스 100의 값을 호출합니다 . 그 값이기 때문에 undefined언급 한 오류가 발생합니다. JavaScript 및 TypeScript에서는 new Array(100)대신 원합니다 .

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


1
나는 new Array (100)를 원하지 않습니다. 유형화 된 Thing 배열을 원합니다. 이것이 버그인지 아니면 문서 사양에 대한 오해인지 모르겠습니다.
Klaus Nji
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.