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?

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();
        }
    }
}

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.