如何在序列化期间忽略 class 的受保护只读成员

How to ignore protected readonly member of class during serialization

假设我在 Typescript 中有一个 class,它有一个受保护的只读成员,它是一个构造函数参数,并且多个 class 从 class 扩展并使用 属性:

class Yolo {
    public readonly swolo: boolean = false;
    // Lots of other properties

    constructor(protected readonly swag: string = '') {}
}

并且我希望从 JSON.stringify(new Yolo()) 产生的字符串没有任何 swag:

{"swolo":false, ...(Every other property except "swag")}

有没有办法通过排除(即不在 JSON.stringify 上使用第二个参数)来实现此 ,因为 [=53] 上还有许多其他属性=], 并且仍然保留 Intellisense?

我最初的倾向是将 toJSON 写成

public toJSON() {
    const serializableEntries: {
        -readonly [K in keyof Yolo]: Yolo[K]
    } = {
        ...this
    };

    delete serializableEntries.swag;
    return serializableEntries;
}

但这会导致编译错误,因为 keyof Yolo 不包括 swag:

Property 'swag' does not exist on type '{ toJSON: () => string; }'.

我考虑过以下解决方法:

  1. 我可以在 toJSON
  2. 中转换为 any
  3. 我可以删除 readonly Class 声明中的修饰符并删除 toJSON
  4. serializableEntries 上的类型声明
  5. 我可以swagpublic

但我认为这些选项中的 none 是有利的。我想保持 Intellisense 和访问修饰符不变。有可能吗?

如何使用 object destructuring:

public toJSON(): string {
    const { swag: _, ...props } = this;
    return JSON.stringify(props);
}

这具有将 this 的所有属性复制到 props 的效果,除了 swag 属性.

console.log(new Yolo("shwag").toJSON()); //{"swolo":false}

我觉得不错。希望有所帮助;祝你好运!

Link to code