Penggunaan array yang diketik TypeScript

96

Saya memiliki definisi kelas TypeScript yang dimulai seperti ini;

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

Sepertinya array bertipe Thing tidak diterjemahkan dengan benar ke tipe array Javascript yang sesuai. Ini adalah cuplikan dari JavaScript yang dihasilkan:

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

Menjalankan kode yang berisi objek Person, memunculkan pengecualian saat mencoba menginisialisasi bidang _possession:

Kesalahannya adalah "0x800a138f - Kesalahan runtime Microsoft JScript: Tidak dapat memperoleh nilai properti '100': objek adalah nol atau tidak ditentukan".

Jika saya mengubah jenis _possession menjadi any[] dan menginisialisasi _possession dengan new Array()pengecualian tidak dilempar. Apakah saya melewatkan sesuatu?

Klaus Nji
sumber

Jawaban:

120

Anda mengalami kesalahan dalam sintaksis Anda di sini:

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

Ini tidak membuat "larik hal". Untuk membuat array, Anda cukup menggunakan ekspresi literal array:

this._possessions = [];

Dari konstruktor array jika Anda ingin mengatur panjangnya:

this._possessions = new Array(100);

Saya telah membuat contoh kerja singkat yang dapat Anda coba di taman bermain .

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();
        }
    }
}
Fenton
sumber
2
itu tidak memperbaiki panjangnya, melainkan harus melakukan pra-alokasi array
Sebastian
mengapa Anda tidak bisa melakukannya private _possessions: Thing[] : []; dalam definisi kelas?
SuperUberDuper
54

Anda bisa mencoba salah satu dari ini. Mereka tidak memberi saya kesalahan.

Ini juga merupakan metode yang disarankan dari skrip ketikan untuk deklarasi array .

Dengan menggunakan Array<Thing>itu adalah memanfaatkan generik dalam naskah ketikan. Ini mirip dengan meminta List<T>kode dalam 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[] = [];

atau

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

constructor(){
    //assign
    this._possessions = new Array<Thing>();
    //or
    this._possessions = [];
}
Kieran
sumber
3
Untuk mengalokasikan ukuran, gunakan new Array<Thing>(100).
Doug Domeny
1
Anda juga dapat menggunakan ... <Thing> []
danday74
@ danday74 - Saya telah memperbarui untuk menyertakan metode Anda, ini adalah default saat menggunakan ts-lint recomended / config terbaru.
Kieran
9

Terjemahan benar, ekspresi tidak diketik. TypeScript salah mengetik ekspresi new Thing[100]sebagai larik. Ini harus menjadi kesalahan untuk mengindeks Thing, fungsi konstruktor, menggunakan operator indeks. Dalam C # ini akan mengalokasikan array 100 elemen. Dalam JavaScript, ini memanggil nilai pada indeks 100 Thingseolah-olah adalah konstruktor. Karena nilai undefineditu menimbulkan kesalahan yang Anda sebutkan. Di JavaScript dan TypeScript yang Anda inginkan new Array(100).

Anda harus melaporkan ini sebagai bug di CodePlex.

chuckj
sumber
1
Saya tidak ingin Array baru (100). Saya ingin array Thing yang diketik. Saya tidak tahu apakah ini bug atau hanya salah tafsir saya terhadap spesifikasi dokumen.
Klaus Nji