web-dev-qa-db-ja.com

タイプスクリプトの配列

TypeScriptで配列を宣言してアクセスするのが難しいと感じています。

以下は私のために働いているコードです

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

以下のようにコードを変更すると、配列項目に値を割り当てようとすると失敗します。

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

ループにオブジェクトを追加するには、2番目の方法で行う必要があります。

39
VKR

これは非常にc#タイプのコードです。

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

Javascript/TypeScriptでは、そのようなメモリを事前に割り当てることはありません。これは、まったく異なるものを意味します。これはあなたがやりたいことをする方法です:

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

new Book[2];の意味を説明します。これは、実際にはBook [2]の値でnew演算子を呼び出すことを意味します。例えば。:

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

そして、あなたはちょっと見えるはずです。 試してみてください

67
basarat

インスタンス宣言を行う代わりに、これを行うこともできます(ショートカット)。代わりに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.
15
fletchsod