TypeScript tipinde dizi kullanımı


98

Bu şekilde başlayan bir TypeScript sınıf tanımım var;

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];
        }

Görünüşe göre, Thing türünde bir dizi, karşılık gelen Javascript dizi türüne doğru şekilde çevrilmiyor. Bu, oluşturulan JavaScript'ten bir snippet'tir:

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

Bir Person nesnesi içeren kodu yürütme, _possession alanını başlatmaya çalışırken bir istisna atın:

Hata "0x800a138f - Microsoft JScript çalışma zamanı hatası: '100' özelliğinin değeri alınamıyor: nesne boş veya tanımsız".

_Possession tipini olarak değiştirirsem any[] ve _possession'ı new Array()istisna ile başlatırsam atılmaz . Bir şey mi kaçırdım?

Yanıtlar:


122

Burada söz diziminizde bir hata var:

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

Bu bir "şeyler dizisi" yaratmaz. Bir şeyler dizisi oluşturmak için, dizi değişmez ifadesini kullanabilirsiniz:

this._possessions = [];

Uzunluğu ayarlamak istiyorsanız dizi yapıcısının:

this._possessions = new Array(100);

Oyun alanında deneyebileceğiniz kısa bir çalışma örneği oluşturdum .

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
uzunluğu sabitlemez, bunun yerine diziyi önceden tahsis etmelidir
Sebastian

neden private _possessions: Thing[] : []; sınıf tanımında yapamıyorsun ?
SuperUberDuper

55

Bunlardan birini deneyebilirsiniz. Bana hata vermiyorlar.

Ayrıca dizi bildirimi için typcript'ten önerilen yöntemdir .

Kullanarak Array<Thing>typcript içindeki jeneriklerden yararlanmaktadır. Bir List<T>c # kodunda sormaya benzer .

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

veya

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

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

3
Boyutu önceden tahsis etmek için kullanın new Array<Thing>(100).
Doug Domeny

1
Ayrıca şunu da kullanabilirsiniz ... <Thing> []
danday74

@ danday74 - Yönteminizi dahil etmek için güncelledim, ts-lint recomended / latest config kullanılırken varsayılan değerdir.
Kieran

9

Çeviri doğru, ifadenin yazımı doğru değil. TypeScript, ifadeyi new Thing[100]bir dizi olarak yanlış yazıyor . Thingİndeks operatörünü kullanarak bir yapıcı işlevi olan indeksleme hatası olmalıdır . C # 'da bu, 100 elemanlık bir dizi tahsis eder. JavaScript'te bu Thing, bir kurucuymuş gibi dizin 100'deki değeri çağırır . Bu değerler olduğundan undefinedbahsettiğiniz hatayı ortaya çıkarır. Bunun new Array(100)yerine JavaScript ve TypeScript'te istiyorsunuz .

Bunu CodePlex'te bir hata olarak bildirmelisiniz.


1
Yeni Dizi (100) istemiyorum. Yazılmış bir Şey dizisi istiyorum. Bunun bir hata mı yoksa sadece belge spesifikasyonunu yanlış yorumlamam mı olduğunu bilmiyorum.
Klaus Nji
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.