2013-04-26 15 views
31

Sto riscontrando difficoltà nel dichiarare la matrice in dattiloscritto e accedervi.Matrici nello script di tipo

sotto è il codice che lavora per me

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

Quando cambio il mio codice, come di seguito non riesce quando si tenta di assegnare il valore di elemento dell'array.

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

Per aggiungere l'oggetto in un ciclo, devo farlo nel modo seguente.

risposta

58

Questo è un C# tipo di codice:

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

in Javascript/tipografico non allocare memoria in anticipo così, e questo significa qualcosa di completamente diverso. Questo è come si dovrebbe fare quello che vuoi fare:

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

Ora, per spiegare che cosa vorrebbe dire new Book[2];. Ciò significherebbe in realtà che chiama il nuovo operatore sul valore di Book [2]. ad esempio:

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

e dovresti vedere ehi. Try it

+3

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

+1

Grazie, che ha contribuito a – VKR

+0

Aggiornamento: Il 'nuovo libro [2]' darà un errore di TS 0.9: 'accettiamo più "nuovo numero []" ': https://typescript.codeplex.com/wikipage?title=Known%20breaking%20changes%20 tra %200.8%20 e %200.9 quindi il compilatore ti dirà che è sbagliato :) – basarat

0

un modo più pulito per fare questo:

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

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

Poi

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

Ma tu non stanno inizializzando i dati nel costruttore, verranno inizializzati automaticamente? –

+0

Sì, lo fa. Vedi la sezione "Proprietà dei parametri" di http://www.typescriptlang.org/docs/handbook/classes.html –

14

si può anche fare anche questo (taglio più corto), invece di dover fare dichiarazione di istanza. Lo fai invece in JSON.

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. 
Problemi correlati