2016-03-30 7 views
7

Diciamo che ho una classe:Controllare se un oggetto (o solo una classe) ha una proprietà

module MyModule { 
    export class MyClass { 
     x:number; 
     y:number; 
    } 
} 

Poi ho una stringa, "x". Come posso verificare se MyClass ha la proprietà "x"?

Se creo un 'istanza di MyClass e quindi fare:

myClassInstance.hasOwnProperty("x"); 

restituisce false a meno che x ha un set valore di default. Ma non voglio impostare valori predefiniti per ogni proprietà. Sarebbe meglio se potessi farlo senza creare istanze di MyClass.

+0

che voglio fare questo a livello tipografico, non JavaScript. – zeroin

+2

TypeScript non esiste in fase di esecuzione. TypeScript è tradotto in JavaScript prima che venga eseguito. – NineBerry

+0

Se spieghi, perché vuoi controllare qualche proprietà in fase di esecuzione, forse c'è un altro modo per ottenere ciò che cerchi. – NineBerry

risposta

3

TypeScript viene compilato su JavaScript prima dell'esecuzione. Nel codice JavaScript finale, le informazioni sul tipo da TypeScript non sono più disponibili. Quindi non c'è la possibilità di controllare le informazioni sul tipo TypeScript in fase di esecuzione.


Se si vuole fare un controllo a tempo di compilazione, è possibile utilizzare le interfacce, come nel seguente esempio:

interface IHasX 
{ 
    x:any; 
} 

class MyClassA { 
    x:number; 
    y:number; 
} 

class MyClassB { 
    y:number; 
} 

function Test(param: IHasX) 
{ 
    // Do something with param.x 
} 

var objA = new MyClassA(); 
var objB = new MyClassB(); 

Test(objA); 
Test(objB); 

L'ultima riga Test(objB); non riuscirà a compilare perché il compilatore dattiloscritto sa che objB è di tipo MyClassB e che quella classe non ha una proprietà denominata x come richiesto dall'interfaccia IHasX.

0

Ora puoi farlo. Ho rilasciato una versione avanzata del compilatore TypeScript che consente di elencare tutti i membri di una classe o un'interfaccia. Per esempio è possibile effettuare le seguenti operazioni:

export class Person { 
    name: string; 
    surname: string; 
    age: number; 
    country: string; 
} 

function printMembers(clazz: Class) { 
    let fields = clazz.members.filter(m => m.type.kind !== 'function'); //exclude methods. 
    for(let field of fields) { 
     let typeName = field.type.kind; 
     if(typeName === 'class' || typeName === 'interface') { 
      typeName = (<Class | Interface>field.type).name; 
     } 
     console.log(`Field ${field.name} of ${clazz.name} has type: ${typeName}`); 
    } 
} 

//then, somewhere in your code: 
let p = new Person(); 
printMembers(p.constructor.getClass()); 

e questo è l'output:

$ node main.js 
Field name of Person has type: string 
Field surname of Person has type: string 
Field age of Person has type: number 
Field country of Person has type: string 

Potete trovare tutti i dettagli necessari here

Problemi correlati