2017-08-07 201 views
1

我想获取简单Typescript对象的属性名称。获取对象的属性名称

export class Simple { 
    myProperty: string; 
    otherProperty: string = "some text"; 
} 

var s = new Simple(); 
Object.getOwnPropertyNames(s) --> ["otherProperty"] 
for(var property in s) {console.log(property)} --> "otherProperty" 
Object.keys(s) --> ["otherProperty"] 

我不明白为什么“myProperty”没有被捕获。我如何获得未初始化的属性的属性名称?

回答

1

您需要记住,TypeScript主要是JavaScript上的语法糖。在编译TypeScript代码时,不会对JavaScript产生直接影响的所有内容都不会继续。

在这种情况下,您有成员声明。这个的主要特点是定义一个对象可能拥有哪些成员。 JavaScript本身确实允许你在任何对象上设置任意成员,所以使用TypeScript类型的成员声明会限制你有权访问的成员。

对于您的特定情况,您声明了您的班级中的两位有效成员:myPropertyotherProperty。另外,你还用一个值初始化otherProperty

想一想在这一点上JavaScript语言中会发生什么:成员声明不存在,所以剩下的就是初始化成员otherProperty。特别是,这是你的类声明编译JavaScript中:

export class Simple { 
    constructor() { 
     this.otherProperty = "some text"; 
    } 
} 

正如你所看到的,有没有myProperty,因为没有什么是以往任何时候都分配给它。所以对于JavaScript方面来说,它不存在(还)。

这意味着在运行时(JavaScript是TypeScript的运行时),存在Simple类型对象的唯一属性是otherProperty,这就是您检查对象时唯一得到的结果。

+0

我明白了,非常感谢你对这个清晰的解释。但是在Typescript中是否有一个“语法”方法,可以让你获得对象的属性?某种类似于Simple.getProperties的静态类型() – fazega

+2

没有,因为没有将这些信息编译为JavaScript。您也许可以编写一个预构建步骤来分析TypeScript代码,然后将类型信息分别作为一些元数据公开。不知道你将如何开始。在一个有点相关的话题上,看一看[decorators](https://www.typescriptlang.org/docs/handbook/decorators.html),它也可以以装饰器元数据公开到JavaScript的方式进行编译(在页面底部)。 – poke

+0

谢谢!我一直在寻找这样的东西,但看着“属性”(C#!)而不是“装饰者”;) – fazega