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.