Typescript 检查对象(或只是类)是否具有属性
假设我有一门课:Typescript 检查对象(或只是类)是否具有属性,typescript,Typescript,假设我有一门课: module MyModule { export class MyClass { x:number; y:number; } } 然后我有一个字符串,“x”。如何检查MyClass是否具有属性“x” 如果我创建MyClass的实例,然后执行以下操作: myClassInstance.hasOwnProperty("x"); 除非x设置了默认值,否则返回false。但我不想为每个属性设置默认值。如果我能在不创建MyClass实例的情
module MyModule {
export class MyClass {
x:number;
y:number;
}
}
然后我有一个字符串,“x”。如何检查MyClass是否具有属性“x”
如果我创建MyClass的实例,然后执行以下操作:
myClassInstance.hasOwnProperty("x");
除非x设置了默认值,否则返回false。但我不想为每个属性设置默认值。如果我能在不创建MyClass实例的情况下做到这一点,那就最好了。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);
最后一行<代码>测试(objB)将无法编译,因为TypeScript编译器知道
objB
属于MyClassB
类型,并且该类没有接口IHasX
所要求的名为x
的属性。现在您可以执行此操作。我发布了一个增强版的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());
您可以找到所需的所有详细信息我希望在TypeScript级别执行此操作,而不是JavaScript。TypeScript在运行时不存在。TypeScript在执行之前会被翻译成JavaScript。如果您解释一下,为什么要在运行时检查某些属性,也许还有其他方法可以实现您的尝试。我有一个基本样式类,其中包含所有可用SVG属性的列表。然后我有一些类,它们扩展了Style类并包含一些附加信息,比如lineLength——这些不是SVG属性,但我希望保持它们的样式,因为我希望将负责元素可视部分的所有值保持在一个位置。所以,当我创建SVG元素时,我需要在其上设置基本样式类的所有属性,但不能设置像lineLength这样的属性。所以我想我可以创建一个Style实例并检查属性是否在这个类中。我想我可以使用getter和setter,然后这样做:Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Style),“x”)
$ 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