2016-12-11 21 views
5

Tôi có lớp trừu tượng Model với thuộc tính tĩnh và một lớp chung khác Controller<T extends Model>. Tôi muốn truy cập thuộc tính tĩnh của Model trong một thể hiện của Controller. Điều đó sẽ như thế này:Loại truy cập thuộc tính tĩnh của loại chung

abstract class Model{ 
    static hasStatus: boolean = false; 
} 

class MyModel extends Model{ 
    static hasStatus = true; 
} 

class Controller<T extends Model>{ 
    constructor(){ 
     if(T.hasStatus)... 
    } 
} 

Nhưng TS nói 'T' only refers to a type, but is being used as a value here.

Có một cách dễ dàng để đạt được điều này? Hoặc tôi có nên phân loại Controller cho mỗi Di sản Model và triển khai phương pháp để truy xuất giá trị không?

+0

Làm cách nào để 'T' bị ràng buộc khi tạo' Bộ điều khiển'? –

Trả lời

3

Không có cách nào để làm điều đó trong bản ghi. Các tham số kiểu generic chỉ có thể xuất hiện ở nơi các kiểu có thể xuất hiện trong các khai báo, chúng không thể truy cập được khi chạy. Lý do cho điều đó là đơn giản - chức năng javascript đơn được tạo ra cho mỗi phương thức của lớp chung, và không có cách nào cho hàm đó biết loại thực tế nào được chuyển thành tham số kiểu generic.

Nếu bạn cần thông tin đó trong thời gian chạy, bạn phải thêm một tham số để các nhà xây dựng và thông qua một loại chính mình khi gọi đó là:

class Controller<T extends Model>{ 
    constructor(cls: typeof Model){ 
     if (cls.hasStatus) { 
     } 
    } 
} 

let c = new Controller<MyModel>(MyModel); 

Sau đây là cách có vẻ khi biên soạn để javascript để minh họa cho điểm - không có gì còn lại của các thông số chung ở đó và nếu bạn xóa thông số cls thì không có thông tin nào về vị trí của hasStatus.

var Controller = (function() { 
    function Controller(cls) { 
     if (cls.hasStatus) { 
     } 
    } 
    return Controller; 
}()); 
var c = new Controller(MyModel); 
Các vấn đề liên quan