ค้นหาเว็บไซต์

การใช้ 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

บทความที่เกี่ยวข้อง