2016-02-27 24 views
7

Tôi đang làm gì sai trong mã dưới đây?Mở rộng Mảng từ TypeScript

Tôi đang cố gắng mở rộng Array trên lớp học của mình MyNumberList và sau đó cố gắng sử dụng nó. Những gì tôi thấy là không có mục nào dường như được thêm vào danh sách. Tôi nhận được một undefined khi tôi cố gắng truy cập vào các yếu tố danh sách.

Tái bút: Tôi đang sử dụng nguyên cảo 1.8.2

class MyNumberList extends Array<number> { 

    constructor(...numbers: number[]) { 
    // looks like this is not working 
    super(...numbers); 
    } 
} 

let statusCodes: MyNumberList = new MyNumberList(10, 20, 30); 

console.log(statusCodes[0]);  // printing undefined 
console.log(statusCodes.length); // printing 0 

Trả lời

8

Mảng không thể được mở rộng trong ES5, vì vậy mã mà trình biên dịch nguyên cảo sản xuất không hoạt động đúng. Mã nó tạo ra cho nhà xây dựng của bạn là thế này:

function MyNumberList() { 
    var numbers = []; 
    for (var _i = 0; _i < arguments.length; _i++) { 
     numbers[_i - 0] = arguments[_i]; 
    } 
    _super.apply(this, numbers); 
} 

... nơi _superArray. Trong quá trình bình thường của mọi thứ, _super.apply(this, numbers) sẽ hoạt động tốt, nhưng hàm Array hoạt động khác khi nó được gọi là hàm khi nó được gọi là hàm tạo. Babel và ES2015 khác (ES6) đến ES5 transpilers có cùng một vấn đề. Để kế thừa từ một mảng yêu cầu các tính năng bên trong công cụ JavaScript không có trong các công cụ ES5.

Nếu bạn thay đổi mã constructor của bạn để:

constructor(...numbers: number[]) { 
    super(); 
    this.push(...numbers); 
} 

... nó sẽ cư dụ của bạn một cách chính xác. Tuy nhiên, tôi không thể đảm bảo các tính năng khác của Array sẽ hoạt động tốt như thế nào.

+0

Hmm thú vị. Những gì bạn nói có ý nghĩa.Tôi đã cố gắng để thực hiện một bộ sưu tập hạng nhất, nơi tôi sẽ tăng thêm các chức năng được thừa kế từ 'mảng 'với một số hoạt động miền cụ thể. Điều đáng buồn là nó sẽ không hoạt động với cú pháp thông thường. – codematix

+1

Cảm ơn sự giúp đỡ của bạn @ t-j-crowder. Cách thay thế của bạn khi gọi 'this.push (... numbers)' dường như đang hoạt động. Tuy nhiên tôi có thể cần tinkering sâu hơn để tìm hiểu những gì khác phá vỡ. TIL, khi sử dụng TypeScript, bạn nên xem & hiểu mã JavaScript được biên dịch. – codematix

+0

nghiên cứu tuyệt vời, giải pháp phù hợp với tôi – BobbyTables

Các vấn đề liên quan