2013-04-26 13 views
31

Znajduję trudności w zadeklarowaniu tablicy w maszynopisie i uzyskiwaniu dostępu do niej.Tablice w typie skryptu

poniżej jest kod działa dla mnie

class Book { 
    public BookId: number; 
    public Title: string; 
    public Author: string; 
    public Price: number; 
    public Description: string; 
} 

class dataservice { 
    getproducts() { 
     var bk = new Book(); 
     bk.Author = "vamsee"; 
     bk.BookId = 1; 
     var bks: Book[] = [bk,bk]; 

     return bks.length; 
    } 
} 

var ds = new dataservice(); 
var button = document.createElement('button'); 

button.onclick = function() {  
    alert(ds.getproducts().toString()); 
} 

document.body.appendChild(button); 

Kiedy zmiana kodu jak poniżej to zawiedzie, gdy próbuje przypisać wartość do elementu tablicy.

var bks: Book[] = new Book[2]; 
bks[0].Author = "vamsee"; 
bks[0].BookId = 1; 
return bks.length; 

Dla mnie, aby dodać obiekt w pętli, muszę to zrobić w drugą stronę.

Odpowiedz

58

To bardzo C# typ kodu:

var bks: Book[] = new Book[2]; 

w JavaScript/maszynopis nie przydzielić pamięci z przodu tak, a to oznacza coś zupełnie innego. To w jaki sposób robić to, co chcesz zrobić:

var bks: Book[] = []; 
bks.push(new Book()); 
bks[0].Author = "vamsee"; 
bks[0].BookId = 1; 
return bks.length; 

teraz wyjaśnić, co oznaczałoby new Book[2];. Oznaczałoby to w rzeczywistości wezwanie nowego operatora do wartości Book [2]. np .:

Book[2] = function(){alert("hey");} 
var foo = new Book[2] 

i powinieneś zobaczyć hej. Try it

+3

+1 dla 'BKS var: Book [] = [];' – Fenton

+1

Dziękuję, że pomogła – VKR

+0

Update: 'Nowa książka [2]' daje błąd w TS 0.9: 'Nie dłużej akceptować "nowy numer []" ': https://typescript.codeplex.com/wikipage?title=Known%20breaking%20changes%20between%200.8%20and%200.9, więc kompilator powie Ci, że jest źle :) – basarat

0

Czystsze sposobem, aby to zrobić:

class Book { 
    public Title: string; 
    public Price: number; 
    public Description: string; 

    constructor(public BookId: number, public Author: string){} 
} 

Następnie

var bks: Book[] = [ 
    new Book(1, "vamsee") 
]; 
+0

Ale ty nie inicjalizują danych w konstruktorze, czy zostaną zainicjowane automatycznie? –

+0

Tak, robi. Zobacz sekcję "Właściwości parametrów" na stronie http://www.typescriptlang.org/docs/handbook/classes.html –

14

Można również to, jak dobrze (krótszy cut) zrobić zamiast robić deklarację instancji. Robisz to w JSON zamiast tego.

class Book { 
    public BookId: number; 
    public Title: string; 
    public Author: string; 
    public Price: number; 
    public Description: string; 
} 

var bks: Book[] = []; 

bks.push({BookId: 1, Title:"foo", Author:"foo", Price: 5, Description: "foo"}); //This is all done in JSON.