2017-08-07 2 views
1

のプロパティ名を取得します。私はシンプルな活字体オブジェクトのプロパティ名を取得したいオブジェクト

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

あなたは活字体ではJavaScriptの上に、主にシンタックスシュガーであることを覚えておく必要があります。 JavaScriptに即座に影響を及ぼさないものはすべて、TypeScriptコードのコンパイル時に持ち越されません。この場合

、あなたはメンバーの宣言を持っています。これの主な特徴は、オブジェクトが持つメンバを定義することです。 JavaScript自体では任意のオブジェクトを任意のメンバーに設定できます。したがって、TypeScript型のメンバー宣言によって、アクセスできるメンバーが制限されます。 myPropertyotherProperty:あなたの特定のケースについては

は、あなたのクラスの2つの有効なメンバを宣言します。さらに、 otherPropertyを値で初期化します。

は、この時点では、JavaScriptの土地で何が起こるかを考えてみて:メンバーの宣言は存在しないので、残っているすべてが初期化メンバーotherPropertyです。特に、これはあなたのクラス宣言は、JavaScriptでのコンパイルです:何も今までそれに割り当てられていないため

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

あなたが見ることができるように、何のmyPropertyはありません。したがって、JavaScript側では(まだ)存在しません。

これは、実行時に(JavaScriptが活字体の実行時間である)ことを意味し、タイプSimpleのオブジェクトが存在する唯一のプロパティは、それがあなたのオブジェクトを検査する際にあなたが得る唯一の一つだ理由であるotherPropertyです。

+0

私は理解しては、この明確な説明のためにどうもありがとうございました。しかし、オブジェクトのプロパティを取得するためのTypescriptには "構文的な"メソッドがありますか? Simple.getProperties()のような "静的"なもの – fazega

+2

この情報はJavaScriptにコンパイルされていないため、ありません。 TypeScriptのコードを解析し、型情報をいくつかのメタデータとして個別に公開するビルド前のステップを書くことができます。あなたがそれをどのように始めるのかはわかりません。やや関連するトピックについては、[デコレータ](https://www.typescriptlang.org/docs/handbook/decorators.html)を見てください。デコレータのメタデータをJavaScriptに公開するようにコンパイルすることもできます(ページの下)。 – poke

+0

ありがとうございました!私はこの種のものを探していましたが、 "Decorators"ではなく "Attributes"(C#!)を見ていました;) – fazega

関連する問題