TypeScriptでゲッター/セッターアクセサーを使用しています。変数とメソッドに同じ名前を付けることはできないため、多くの例で行われているように、変数の前に下のダッシュを付け始めました。
private _major: number;
get major(): number {
return this._major;
}
set major(major: number) {
this._major = major;
}
ここで、JSON.stringify()メソッドを使用してオブジェクトをJSON文字列に変換すると、変数名がキーとして使用されます:_major。
JSONファイルの前にすべてのキーの前にダッシュを付けたくないので、TypeScriptでgetterメソッドの名前を使用できるようにする可能性はありますか?または、getter/setterメソッドを使用してもクリーンなJSON出力を生成する他の方法はありますか?
文字列出力に書き込まれる前に、JSONキーを手動で変更する方法があることを私は知っています。しかし、もっと簡単な解決策があるかどうか興味があります。
これがJSFiddleです これは現在の動作を示しています。
いいえ、プロパティ名の代わりにゲッター/セッター名を使用してJSON.stringify
を使用することはできません。
しかし、あなたはこのようなことをすることができます:
class Version {
private _major: number;
get major(): number {
return this._major;
}
set major(major: number) {
this._major = major;
}
toJsonString(): string {
let json = JSON.stringify(this);
Object.keys(this).filter(key => key[0] === "_").forEach(key => {
json = json.replace(key, key.substring(1));
});
return json;
}
}
let version = new Version();
version.major = 2;
console.log(version.toJsonString()); // {"major":2}
@ Jan-Aagaardソリューションに基づいて私はこれをテストしました
public toJSON(): string {
let obj = Object.assign(this);
let keys = Object.keys(this.constructor.prototype);
obj.toJSON = undefined;
return JSON.stringify(obj, keys);
}
toJSONメソッドを使用するため
プロパティを繰り返して文字列を操作するのは危険だと思います。オブジェクト自体のプロトタイプを使用して、次のようにします。
public static toJSONString() : string {
return JSON.stringify(this, Object.keys(this.constructor.prototype)); // this is version class
}
私は小さなライブラリ ts-typed を作成しました。これは、実行時の入力を目的としたゲッター/セッターを生成します。 JSON.stringify()を使用するときに同じ問題に直面しました。だから私は一種のシリアライザーを追加し、それをtoJSONと呼ぶ一種のtoString(Javaで)購入を実装することを提案することによってそれを解決しました。
次に例を示します。
import { TypedSerializer } from 'ts-typed';
export class RuntimeTypedClass {
private _major: number;
get major(): number {
return this._major;
}
set major(major: number) {
this._major = major;
}
/**
* toString equivalent, allows you to remove the _ prefix from props.
*
*/
toJSON(): RuntimeTypedClass {
return TypedSerializer.serialize(this);
}
}