2017-08-07 200 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