การใช้ JSON.stringify ร่วมกับ getter/setter ของ TypeScript
ฉันกำลังใช้ getter/setter accessors ใน 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 ที่แสดงพฤติกรรมปัจจุบัน
คำตอบ #1
ไม่ คุณไม่สามารถใช้ 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}
คำตอบ #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
