2016-03-19 10 views
5

Mit TypeScript können wir Klassen und ihre öffentlichen Eigenschaften definieren. Wie kann ich eine Liste aller öffentlichen Eigenschaften erhalten, die für eine Klasse definiert sind?Ich möchte alle öffentlichen Eigenschaften einer Klasse/Schnittstelle auflisten

class Car { 
    model: string; 
} 

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

Gibt es eine Möglichkeit Auto emittieren seine model Eigenschaft zu machen?

+2

Dies wurde möglicherweise schon beantwortet (verwenden Sie 'hasOwnProperty'): https://StackOverflow.com/questions/35691858/typescript-hasownproperty-äquivalent und der' typeof' -Operator https://developer.mozilla.org/en -US/docs/Web/JavaScript/Referenz/Operatoren/typeof –

+1

Zur Laufzeit sehen 'public' und' private' Mitglieder gleich aus, daher glaube ich nicht, dass es möglich ist, die öffentliche API zu finden, wie du sie beschrieben hast. – Aaron

Antwort

-3

aktualisiert Antwort (auch Crane Weirdo Antwort auf letzte JS öffentlich/privat sehen, was meine Antwort bezieht sich nicht auf):

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 ""; 
    } 
} 

Verbrauch:

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."); 
    } 

} 

Ausgang:

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. 

Vorherige Antwort:

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

Dieser Code ist falsch. Der Typ von 'Schlüssel' wird niemals 'Funktion' sein, und' hasOwnProperty' schließt Eigenschaften aus, die vom Prototyp geerbt wurden. Es enthält auch keine deklarierten, aber undefinierten Eigenschaften und schließt private oder geschützte Eigenschaften nicht aus. –

2

Wie Aaron bereits im Kommentar oben erwähnt, sehen öffentliche und private Mitglieder in Javascript gleich aus, daher kann es keine Methode geben, die zwischen ihnen unterscheidet. Zum Beispiel wird die folgende Typoskript-Code

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

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

zusammengestellt: wenn

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

Wie Sie, in der kompilierten JavaScript Version sehen können, gibt es absolut keinen Unterschied zwischen den Mitgliedern model und brand, Veranstaltung einer von ihnen ist privat und der andere ist öffentlich.

Sie können zwischen privaten und öffentlichen Mitgliedern unterscheiden, indem Sie eine Namenskonvention verwenden (z. B. public_member und __private_member).

Verwandte Themen