【发布时间】:2020-03-09 20:24:45
【问题描述】:
假设我在 Typescript 中有一个类,它有一个受保护的只读成员,它是构造函数参数,以及从该类扩展并使用该属性的多个类:
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 上的第二个参数),因为该类还有许多其他属性,并且仍然保留 Intellisense?
我最初的想法是将toJSON 写成类似
public toJSON() {
const serializableEntries: {
-readonly [K in keyof Yolo]: Yolo[K]
} = {
...this
};
delete serializableEntries.swag;
return serializableEntries;
}
但这会导致编译错误,因为keyof Yolo 不包含swag:
类型 '{ toJSON: () => 字符串上不存在属性 'swag'; }'。
我考虑了以下解决方法:
- 我可以在
toJSON中转换为any - 我可以删除
readonly类声明中的修饰符并删除toJSON中serializableEntries上的类型声明 - 我可以公开
swag
但在我看来,这些选项中没有一个是有利的。我想保持 Intellisense 和访问修饰符不变。甚至可能吗?
【问题讨论】:
-
尽可能使用 getter。
-
对不起,我应该在描述中澄清这一点,但这是不可能的,因为该属性实际上是动态的。我会换个问题。
标签: json typescript class encapsulation protected