让我说我有一个班级:
module MyModule {
export class MyClass {
x:number;
y:number;
}
}
然后我有一个字符串,“x”。如何检查MyClass是否具有属性“x”?
如果我创建一个MyClass实例,然后执行:
myClassInstance.hasOwnProperty("x");
除非x设置了默认值,否则返回false。但我不想为每个属性设置默认值。如果我甚至可以在不创建MyClass实例的情况下做到这一点,那将是最好的。
答案 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