检查对象(或只是一个类)是否具有属性

时间:2016-03-30 12:14:27

标签: typescript

让我说我有一个班级:

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

然后我有一个字符串,“x”。如何检查MyClass是否具有属性“x”?

如果我创建一个MyClass实例,然后执行:

myClassInstance.hasOwnProperty("x");

除非x设置了默认值,否则返回false。但我不想为每个属性设置默认值。如果我甚至可以在不创建MyClass实例的情况下做到这一点,那将是最好的。

2 个答案:

答案 0 :(得分:5)

TypeScript在执行前编译为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);将无法编译,因为TypeScript编译器知道objB类型为MyClassB,并且该类没有所需的属性x界面IHasX

答案 1 :(得分: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