2016-03-30 4 views
7

Допустим, у меня есть класс:Проверьте, является ли объект (или просто класс) имеет свойство

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

Тогда у меня есть строка, «х». Как проверить, имеет ли MyClass свойство «x»?

Если я создаю экземпляр MyClass, а затем сделать:

myClassInstance.hasOwnProperty("x"); 

возвращает ложь, если й не имеет установить значение по умолчанию. Но я не хочу устанавливать значения по умолчанию для каждого свойства. Было бы лучше, если бы я мог сделать это без создания экземпляра MyClass.

+0

Я хочу сделать это в уровне машинописи, не JavaScript. – zeroin

+2

ТипScript не существует во время выполнения. ТипScript переводится в JavaScript до его выполнения. – NineBerry

+0

Если вы объясните, почему вы хотите проверить какое-либо свойство во время выполнения, возможно, есть другой способ добиться того, что вы пытаетесь сделать. – NineBerry

ответ

3

ТипScript скомпилирован в JavaScript перед выполнением. В последнем коде JavaScript информация типа из TypeScript больше не доступна. Таким образом, нет возможности проверять информацию типа TypeScript во время выполнения.


Если вы хотите, чтобы выполнить проверку во время компиляции, вы можете использовать интерфейсы, как в следующем примере:

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); 

Последняя строка Test(objB); не будет компилироваться, потому что машинопись компилятор знает, что objB имеет тип MyClassB и что этот класс не имеет свойства с именем x, как требуется интерфейсом IHasX.

0

Теперь вы можете это сделать. Я выпустил расширенную версию компилятора TypeScript, которая позволяет вам перечислять всех членов класса или интерфейса. Например, вы можете сделать следующее:

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()); 

и это выход:

$ 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 

Вы можете найти все детали, необходимые here

Смежные вопросы