Làm thế nào để khởi tạo, khởi tạo và điền một mảng trong TypeScript?


80

Tôi có các lớp sau trong TypeScript:

class bar {
    length: number;
}

class foo {
    bars: bar[] = new Array();
}

Và sau đó tôi có:

var ham = new foo();
ham.bars = [
    new bar() {          // <-- compiler says Expected "]" and Expected ";"
        length = 1
    }
];

Có cách nào để làm điều đó trong TypeScript không?

CẬP NHẬT

Tôi đã nghĩ ra một giải pháp khác bằng cách đặt một phương thức để trả về chính nó:

class bar {
    length: number;

    private ht: number;
    height(h: number): bar {
        this.ht = h; return this;
    }

    constructor(len: number) {
        this.length = len;
    }
}

class foo {
    bars: bar[] = new Array();
    setBars(items: bar[]) {
        this.bars = items;
        return this;
    }
}

vì vậy bạn có thể khởi tạo nó như sau:

var ham = new foo();
ham.setBars(
    [
        new bar(1).height(2),
        new bar(3)
    ]);

Sẽ thực sự hữu ích nếu có các trình khởi tạo đối tượng trong TypeScript tương tự như C #. [ {length: 1} ]không phải là trường hợp của thanh nhưng nếu được hỗ trợ, new bar() { length = 1 }sẽ là trường hợp của thanh. Có lẽ chúng ta nên đưa ra một đề xuất tính năng cho việc này?
orad

Câu trả lời:


68

Không có cú pháp khởi tạo trường như vậy cho các đối tượng trong JavaScript hoặc TypeScript.

Lựa chọn 1:

class bar {
    // Makes a public field called 'length'
    constructor(public length: number) { }
}

bars = [ new bar(1) ];

Lựa chọn 2:

interface bar {
    length: number;
}

bars = [ {length: 1} ];

8
làm cho mọi việc rõ ràng hơn và typesafe:bars:bar[]=[{length:1}]
Patrice

Có cách nào để làm điều này mà không cần xác định các lớp không?
Liu Zhang

1
Câu hỏi là về cách khởi tạo một mảng trong một lớp. Không có cách nào để khởi tạo một mảng trong một lớp mà không sử dụng các lớp.
Ryan Cavanaugh

20

Nếu bạn thực sự muốn có các tham số được đặt tên cộng với việc các đối tượng của bạn là các thể hiện của lớp, bạn có thể làm như sau:

class bar {
    constructor (options?: {length: number; height: number;}) {
        if (options) {
            this.length = options.length;
            this.height = options.height;
        }
    }
    length: number;
    height: number;
}

class foo {
    bars: bar[] = new Array();
}

var ham = new foo();
ham.bars = [
    new bar({length: 4, height: 2}),
    new bar({length: 1, height: 3})
];

Ngoài ra đây là mục liên quan trên trình theo dõi vấn đề sắp chữ.


+1 cho liên kết vấn đề. Bạn cũng có thể thực hiện khởi tạo giá trị tùy chọn: options? : {length?: number; height?: number;}
Cryptix Thạc sĩ

7

Một giải pháp đơn giản có thể là:

interface bar {
    length: number;
}

let bars: bar[];
bars = [];

1

Giải pháp khác:

interface bar {
    length: number;
}

bars = [{
  length: 1
} as bar];

0

Nếu bạn muốn 'thêm' các mục bổ sung vào một trang, bạn có thể muốn tạo một mảng bản đồ. Đây là cách tôi tạo một mảng bản đồ và sau đó thêm kết quả vào đó:

import { Product } from '../models/product';

products: Array<Product>;          // Initialize the array.

[...]

let i = 0;
this.service.products( i , (result) => {

    if ( i == 0 ) {
        // Create the first element of the array.
        this.products = Array(result);
    } else { 
        // Add to the array of maps.
        this.products.push(result);
    }

});

Nơi product.ts trông giống như ...

export class Product {
    id: number;
    [...]
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.