2016-03-19 18 views
5

Sử dụng TypeScript, chúng tôi có thể xác định các lớp và thuộc tính công khai của chúng. Làm thế nào tôi có thể nhận được một danh sách tất cả các thuộc tính công khai được định nghĩa cho một lớp.Tôi muốn liệt kê tất cả các thuộc tính công khai của một Lớp/Giao diện

class Car { 
    model: string; 
} 

let car:Car = new Car(); 
Object.keys(car) === []; 

Có cách nào để ô tô phát ra thuộc tính model của nó không?

+2

Điều này có thể đã được trả lời (sử dụng 'hasOwnProperty'): https://stackoverflow.com/questions/35691858/typescript-hasownproperty-equivalent và toán tử' typeof' https://developer.mozilla.org/en -US/docs/Web/JavaScript/Tham khảo/Toán tử/typeof –

+1

Khi chạy các thành viên 'public' và' private' trông giống nhau, vì vậy tôi không nghĩ rằng có thể tìm thấy API công khai như bạn mô tả. – Aaron

Trả lời

-3

câu trả lời Cập nhật (cũng xem câu trả lời Crane Weirdo về thức JS công cộng/tư nhân, mà câu trả lời của tôi không đề cập đến):

class Vehicle { 
    axelcount: number; 
    doorcount: number; 

    constructor(axelcount: number, doorcount: number) { 
     this.axelcount = axelcount; 
     this.doorcount = doorcount; 
    } 

    getDoorCount(): number { 
     return this.doorcount; 
    } 
} 

class Trunk extends Vehicle { 
    make: string; 
    model: string; 

    constructor() { 
     super(6, 4); 
     this.make = undefined; // forces property to have a value 
    } 

    getMakeAndModel(): string { 
     return ""; 
    } 
} 

Cách sử dụng:

let car:Trunk = new Trunk(); 
car.model = "F-150"; 

for (let key in car) { 
    if (car.hasOwnProperty(key) && typeof key !== 'function') { 
     console.log(key + " is a public property."); 
    } else { 
     console.log(key + " is not a public property."); 
    } 

} 

Output:

axelcount is a public property. 
doorcount is a public property. 
make is a public property. 
model is a public property. 
constructor is not a public property. 
getMakeAndModel is not a public property. 
getDoorCount is not a public property. 

Câu trả lời trước:

class Car { 
    model: string; 
} 

let car:Car = new Car(); 

for (let key in car) { 
    // only get properties for this class that are not functions 
    if (car.hasOwnProperty(key) && typeof key !== 'function') { 
    // do something 
    } 
} 
+5

Mã này sai. Kiểu 'khóa' sẽ không bao giờ là 'hàm', và' hasOwnProperty' sẽ loại trừ các thuộc tính được kế thừa từ nguyên mẫu. Nó cũng không bao gồm các thuộc tính được khai báo nhưng chưa được xác định và không loại trừ các thuộc tính riêng tư hoặc được bảo vệ. –

2

Giống như Aaron đã đề cập trong nhận xét ở trên, các thành viên công khai và riêng tư trông giống nhau trong Javascript, vì vậy không thể có phương pháp phân biệt giữa chúng. Ví dụ, sau đây nguyên cảo Mã

class Car { 
    public model: string; 
    private brand: string; 

    public constructor(model:string , brand: string){ 
     this.model = model; 
     this.brand = brand; 
    } 
}; 

được biên dịch để:

var Car = (function() { 
    function Car(model, brand) { 
     this.model = model; 
     this.brand = brand; 
    } 
    return Car; 
}()); 
; 

Như bạn có thể thấy, trong phiên bản JavaScript biên soạn, hoàn toàn không có sự khác biệt giữa các thành viên modelbrand, sự kiện mặc dù một trong số đó là riêng tư và một trong số đó là công khai.

Bạn có thể phân biệt giữa các thành viên riêng tư và công khai bằng cách sử dụng một số quy ước đặt tên (Ví dụ: public_member__private_member).

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